• Obin@feddit.org
      link
      fedilink
      arrow-up
      17
      ·
      edit-2
      17 hours ago

      You mean ‘unnamed’ is what’s confusing you?

      Normally you can do anonymous struct/union members or struct struct/union members that are tagged structs but not anonymous.

      I.e. in standard C you’d have to do either:

      struct foo { int baz; };
      struct bar { struct foo foo; };
      ...
      struct bar data;
      data.foo.baz = 0;
      

      or:

      struct bar { struct {  int baz; } foo; };
      ...
      struct bar data;
      data.baz = 0;
      

      but to do the following, you’d need the extension:

      struct foo { int baz; };
      struct bar { struct foo; };
      ...
      struct bar data;
      data.baz = 0;
      
      • mina86@lemmy.wtf
        link
        fedilink
        arrow-up
        8
        ·
        16 hours ago

        Minor correction: Unnamed structs and unions (so your second example) are not part of C. They are GNU extensions.

        • MinekPo1 [it/she]@lemmygrad.ml
          link
          fedilink
          arrow-up
          3
          ·
          edit-2
          12 hours ago

          “ANSI C” by Kernighan and Ritchie disagrees , including that syntax (note : retranslation from Polish as that’s the language my copy is in) :

          A8.3

          […]

          struct-union-specifier:
          , union-struct identifier ₒₚₜ { compound-declaration-list }
          , union-struct identifier

          […]

          Specifiers of structures or unions with [a compound declaration] list, but with no label [identifier], creates a unique type; it may only be referred to in the declaration in which it is part.

    • mina86@lemmy.wtf
      link
      fedilink
      English
      arrow-up
      12
      ·
      edit-2
      16 hours ago

      Tag is what goes after the struct keyword to allow referring to the struct type. Structs don’t have to have a tag. Name is what field are called. Adapting Obin’s example:

      struct foo { int baz; };
      struct bar { struct foo qux; };
      struct bar data;
      data.qux.baz = 0;
      

      foo and bar are tags for struct foo and struct bar types respectively; baz and qux are field names; and data is a variable name.