PRB: Nested Nameless Structs Can Cause C2020 Error in C

Last reviewed: August 18, 1997
Article ID: Q64686

The information in this article applies to:

  • The Microsoft C/C++ Compiler (CL.EXE) included with: - Microsoft C for MS-DOS, versions 6.0, 6.0a, 6.0ax - Microsoft C for OS/2, versions 6.0, 6.0a - Microsoft C/C++ for MS-DOS, version 7.0 - Microsoft Visual C++ for Windows, versions 1.0, 1.5 - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 4.0, 4.1, 4.2,

         5.0
    

SYMPTOMS

In Microsoft C, using a nameless structure as a member of a structure causes a compiler error if the two structures both have members with the same name. C versions 6.x generate the error:

   C2030: 'varname': struct/union member redefinition.

In C/C++ versions 7.0 and later, the error is:

   error C2020: 'varname' : 'struct' member redefinition

The code sample below, when built as a C source file, reproduces the error. The same sample, built as a C++ source file, will not display this behavior.

CAUSE

This is expected behavior, not a bug. When a nameless structure is used within another structure, the members of the nameless structure become members of the new structure. In the C language, the member names must be unique.

MORE INFORMATION

Sample Code

   /* compile options needed: none /Tc */

   void main(void)
    {

      struct s1
        {
          int a,b,c;
        };

      struct s2
        {
          struct s1;  /* nameless struct */
          float z;
          char a[10];  /* error occurs here */
        } *p_s2;
    }

The second structure (s2) is effectively the following:

   struct s2
     {
       int a,b,c;  /* Was nameless struct s1 */
       float z;
       char a[10];  /* Error occurs here */
     } *p_s2;

This illustrates that the member variable "a" is being redefined. Correctly used nameless structures can provide a good technique for building structures with similar data structure without having the complexity of truly nested structures.


Additional query words: 8.0 8.0c 9.0 10.0 11.0 /Tp
Keywords : CLIss kbfasttip
Version : MS- DOS:6.0,6.00a,6.00ax,7.0;OS/2:6.0,6.00a;WINDOWS:1.0,1.5;WINDOWS NT:1.0,2.0, 4.0,4.1,4.2,5.0
Platform : MS-DOS NT OS/2 WINDOWS
Issue type : kbprb
Solution Type : kbcode


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: August 18, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.