You are watching: Which of the following struct definitions is correct in c++?
struct myStruct int one; int two;;vs.
typedef struct int one; int two;myStruct;
The common idiom is utilizing both:
typedef struct S int x; S;They are different definitions. To make the conversation clearer ns will break-up the sentence:
struct S int x; ;typedef struct S S;In the very first line you are defining the id S in ~ the struct name an are (not in the C++ sense). You have the right to use it and define variables or duty arguments that the recently defined type by specifying the kind of the debate as struct S:
void f( struct S discussion ); // struct is compelled hereThe 2nd line adds a kind alias S in the global name room and thus allows you to just write:
void f( S discussion ); // struct keyword no much longer neededNote that due to the fact that both identifier name spaces space different, specifying S both in the structs and global spaces is no an error, together it is no redefining the very same identifier, however rather creating a different identifier in a various place.
To make the distinction clearer:
typedef struct S int x; T;void S() // correct//void T() // error: symbol T already defined together an alias to "struct S"You can define a duty with the exact same name that the struct together the identifiers are kept in various spaces, yet you cannot specify a function with the exact same name together a typedef together those identifiers collide.
See more: Solved Determine Whether Each Change Represents Oxidation Or Reduction.
In C++, the is slightly different as the rules to find a symbol have readjusted subtly. C++ still keeps the two different identifier spaces, yet unlike in C, when you only specify the symbol in ~ the course identifier space, you space not required to administer the struct/class keyword:
// C++struct S int x; ; // S identified as a classvoid f( S a ); // correct: struct is optionalWhat alters are the search rules, not where the identifiers space defined. The compiler will certainly search the worldwide identifier table and also after S has not been uncovered it will search because that S in ~ the class identifiers.
The code presented prior to behaves in the same way:
typedef struct S int x; T;void S() // correct <*>//void T() // error: price T already defined as an alias come "struct S"After the an interpretation of the S role in the second line, the struct S cannot be resolved immediately by the compiler, and also to create things or specify an dispute of that type you have to fall earlier to consisting of the struct keyword: