struct and typedef in C versus C++

后端 未结 3 638
说谎
说谎 2020-12-06 07:02

I am currently using a C++ IDE for something that will need to work on C, and wanted to make sure that I won\'t have problems with this later on. After making the struct bel

相关标签:
3条回答
  • 2020-12-06 07:15
    typedef struct THIS_IS_A_TAG
    {
        int a;
        int b;
    } THIS_IS_A_TYPEDEF;
    
    THIS_IS_A_TYPEDEF object1;     // declare an object.       C:Ok,     C++:Ok
    struct THIS_IS_A_TAG object2;  // declare another object.  C:Ok,     C++:Ok
    THIS_IS_A_TAG object3;         // declare another object.  C:Not Ok, C++:Ok
    

    The reason for the typedef is because C programmers would like to be able to do that third thing, but they can't.

    0 讨论(0)
  • 2020-12-06 07:20

    In both C and C++, the example construct is modestly pointless:

    typedef struct test {
       int a;
       int b;
    };
    

    In C, this says there is a type struct test with the two integers as content. If there was a name between the close brace '}' and the semi-colon ';', then you would get some benefit from the keyword typedef; as it stands, the keyword typedef is redundant, and (if set fussy enough), GCC will warn you about it.

    In C++, this says there is a type struct test; further, in C++, it creates a type test too (which does not happen in C). The keyword typedef can still be left out and the same result will be achieved.

    The syntax is legal; it is not useful, that's all. The keyword typedef can be omitted without changing the program's meaning in the slightest.

    You can do:

    typedef struct test {
       int a;
       int b;
    } test;
    

    Now, in both C and C++, you have a type struct test and an alias for it test.

    0 讨论(0)
  • 2020-12-06 07:34

    The difference between:

    struct Name {};
    

    And

    typedef struct Name {} Name;
    

    Is that, in C, you need to use:

    struct Name instance_name;
    

    With the former, whereas with the latter you may do:

    Name instance_name;
    

    In C++, it is not necessary to repeat the struct keyword in either case. Note that your example in which you create a typedef with no name (i.e. typedef struct Name{};) is non-standard AFAIK (if you use the keyword typedef, then you need to supply an alias to which to typedef that name).

    As for the last variation:

    typedef struct { /* ... */ } Name;
    

    The code above creates an unnamed struct that is aliased to Name. You would use such a struct just the same way you would with typedef struct Name { /* ... */ } Name;, however compilers often emit the name of the struct (not the alias), and so you may get better error messages involving the struct if you give it a name and typedef that as opposed to typedef'ing an anonymous struct.

    0 讨论(0)
提交回复
热议问题