PRB: Concatenation Symbol (##) Yields Errors

Last reviewed: August 26, 1997
Article ID: Q116449

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/C++ for MS-DOS, version 7.0 - Microsoft Visual C++ for Windows, versions 1.0, 1.5, 1.51 - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 2.1, 2.2, 4.0,

         4.1, 4.2, 5.0
    

SYMPTOMS

The ## preprocessing macro concatenates the arguments on either side of the "##". However, as stated in the "ANSI Specification," the resultant value must be a preprocessing token. If it is not, the compiler generates the following error messages:

   C2065: 'token' : undefined
   C2146: syntax error : missing ')' before identifier 'token1'

CAUSE

This is by design. The "ANSI Specification," section 3.8.3.3, page 91, states, regarding ##, that "If the result is not a valid preprocessing token, the behavior is undefined."

These error messages are generated unless one of two things happens:

  • The result of the concatenation is a preprocessing token.

    -or-

  • The compiler option /E is used, and the resulting source file is run through the compiler:

          cl /E test.c > test1.c
          cl test1.c
    

MORE INFORMATION

You can use the sample code below to demonstrate how these error messages are generated. The intention of the code is to construct the text string "_fheapchk" by concatenating "_f" and "heapchk". Because _fheapchk is not a preprocessor token, the error occurs unless you use the /E option.

NOTE: This example doesn't make much sense for 32-bit code, but it does illustrate the kind of problem this article is talking about.

Sample Code

   /* Compile options needed: none
   */

   #define DEFAULTMODEL() _f

   #define FUNCNAME_NA(prefix,func) prefix##func( )

   void checkne_func(int a)
   {
   }

   void main(void)
   {
      checkne_func((int)(FUNCNAME_NA(DEFAULTMODEL(),heapchk)));
   }


Additional query words: 8.00 8.00c 9.00 9.10 10.00 10.10
Keywords : CLIss
Version : MS-DOS:6.0,6.00a,6.00ax,7.0;WINDOWS:1.0,1.5,1.51 WINDOWS NT:1.0,2.0,2.1,2.2,4.0,4.1,4.2,5.0
Platform : MS-DOS NT WINDOWS
Issue type : kbprb


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 26, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.