C11 anonymous structs via typedefs?

后端 未结 3 1289
甜味超标
甜味超标 2021-02-07 08:05

Anonymous structs have been added in the C11 standard, so

typedef struct { 
    struct {int a, b};
    int c; 
} abc_struct;

is valid and stand

相关标签:
3条回答
  • 2021-02-07 08:28

    This was apparently asked in a question to the C committee by Joseph S. Myers of the gcc team. And the answer is no, it is not valid in C11.

    See the answer here:

    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

    And Myers's comment:

    This week's London WG14 meeting agreed to disallow the use of typedefs in declaring anonymous structure and union fields, as per N1549.

    source http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

    The question was asked in SC22WG15.12205 see 5.28 SC22WG14.12205, Anonymous Structures (N1425) in http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

    0 讨论(0)
  • Actually your second snippet is fraught with peril and is not equivalent to the first one without explicitly specifying -fplan9-extensions in gcc.

    In particular ab_struct; declaration on line 6 does NOTHING (as per gcc warning). Just pasting your second snippet in foo.c generates:

    foo.c:6: warning: declaration does not declare anything
    

    And in particular if you were to try:

    typedef struct { 
        int a, b;
    } ab_struct;
    
    typedef struct { 
        ab_struct;
        int c; 
    } abc_struct;
    
    
    int main() {
        abc_struct abc;
        abc.a = 5;
        return 0;
    }
    

    you would get a syntax error on line 13 abc.a = 5; without the -fplan9-extensio.

    whereas using the top snippet your anonymous structure will work as you are thinking it should. Namely:

    typedef struct { 
        struct { 
                int a, b;
        };
            int c; 
    } abc_struct;
    
    
    int main() {
        abc_struct abc;
        abc.a = 5;
        return 0;
    }
    
    0 讨论(0)
  • 2021-02-07 08:36

    Well, I'm afraid I haven't bothered to get the finished standard yet, but here's what the final draft says:

    • An unnamed member whose type specifier is a structure specifier with no tag is called an anonymous structure; an unnamed member whose type specifier is a union specifier with no tag is called an anonymous union.

    I can only interpret the as that only struct {}; and union {}; can be an anonymous struct/union.

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