user1232138
user1232138

Reputation: 5541

How is this a definition?

How is this statement a definition? Isn't it supposed to be a declaration only as it does not allocate any memory until we define an object of the type struct date?

struct Date { int d , m , y ; };

I am readng this book called "The C++ programming language" by Bjarne Stroustrup, in which it has been said (in section 4.9) that this a declaration as well as a definition.

Upvotes: 1

Views: 230

Answers (4)

Steve Jessop
Steve Jessop

Reputation: 279445

It's not a statement in either language. C99 defines statements in 6.8, and C++11 defines statements in 6.

In C, it is not a definition, it's a declaration only: 6.7/5 of C99 says:

A definition of an identifier is a declaration for that identifier that: —for an object, causes storage to be reserved for that object; —for a function, includes the function body; —for an enumeration constant or typedef name, is the (only) declaration of the identifier.

Since this is none of those three things, it's not a definition of an identifier. In the C99 grammar, it's a struct-or-union-specifier (followed by a semi-colon), which in turn is a type-specifier (followed by a semi-colon), which is one of the permitted forms of a declaration (6.7/1).

In C++, it is a class-specifier or class definition: 9/2 of C++11 says

A class-specifier is commonly referred to as a class definition.

In both C and C++ it's common to say that "every definition is a declaration", so that's probably why Stroustrup say's it's a declaration as well as a definition.

In C this is strictly true, because of the definition of "definition" above. In C++ I think it's not actually true in the grammar that a class-specifier is a declaration, but a class definition introduces a complete type, while a class declaration introduces an incomplete type. There's nothing you can do with an incomplete type that you can't also do with the complete type, so the class definition is "as good as" a class declaration like struct Date;, and better.

Upvotes: 4

Open AI - Opting Out
Open AI - Opting Out

Reputation: 24164

It declares the type Date. It defines the Dates members, and therefore the size of the objects it will create.

It has no methods declared, so doesn't need to define anything else for the class to be complete.

Also, if you don't declare or define a constructor, destructor, assignment operator, etc, C++ will try to automatically synthesise them for you. So this minimal definition of Date includes a default constructor, assignment operator, and destructor.

Upvotes: 0

nurettin
nurettin

Reputation: 11756

struct Date; // forward declaration

struct Date{ int d, m, y; }; // class definition (struct is a class-key) 

Also see ISO 14882:98 9.1-1 and -2 class-definition

Also relevant ISO 14882:98 3.2 One-definition-rule

Upvotes: 4

ouah
ouah

Reputation: 145919

This is the declaration of a new type struct Date in C and Date in C++. A declaration is not a statement. And no memory is reserved for the declaration of a new type.

Upvotes: 0

Related Questions