FIX: C2099 Generated Initializing Struct with Macro (116170)



The information in this article applies to:

  • Microsoft C/C++ 7.0
  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 2.0
  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++ 4.1
  • Microsoft Visual C++ 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Learning Edition 5.0

This article was previously published under Q116170

SYMPTOMS

Using a macro to initialize a structure causes the C/C++ compiler to incorrectly generate the following error message:
error C2099: initializer is not a constant

STATUS

Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article.

This problem was corrected in Microsoft Visual C++ version 6.0.

MORE INFORMATION

The sample code below can be used to reproduce this problem:

Sample Code

   /* Compile options needed: none
   */ 

   #include <stddef.h>

   #define ZIP     struct zip_struct
   #define ZOT     struct zot_struct
   #define TABLE   struct table_struct

   ZIP
   {
      ZOT
      {
         int num;
      } m_zot;
   };

   #define MACRO(tok) \ 
      { (offsetof(ZIP, m_zot.tok) - offsetof(ZIP, m_zot)) / sizeof(int) }

   TABLE
   {
      int Offset;
      int ModNum;
   };

   TABLE test[] = { { offsetof(ZIP, m_zot.num) - offsetof(ZIP, m_zot)
                    / sizeof(int) } };
   TABLE test2[] = { { MACRO(num) } };

   void main(void)
   {
   }
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbBug kbfix kbVC600fix KB116170