Search code examples
visual-studio-2010visual-c++preprocessorvisual-studio-macros

Under what conditions does the stringizing preprocessor operator add an _T?


The following code doesn't compile in my VC++ 2010 project:

define MY_MAJOR_VERSION   20
define OLESTR_(str)       L##str
define MOLE( STR )        OLESTR_(#STR)
define MAKE_STR(STR)      MOLE(STR)

REGMAP_ENTRY(MAKE_STR(VERSION), MAKE_STR(MY_MAJOR_VERSION))

VERSION is NOT a macro definition, just text. In the end, I want:

REGMAP_ENTRY(L"VERSION", L"20")

but what I get, when I compile in Debug mode is:

REGMAP_ENTRY(L"VERSION", LL"20")

I'm thinking it's a project setting because I've used that in debug mode in other situations, but never with this problem. Is there a VC++ 2010 setting that would cause the stringizing operator to insert an L or _T?


Solution

  • For me, this (note that I changed MAKE_STR to MAKE_OLESTR - I assume that was a typo in the code posted in the question):

    #define MY_MAJOR_VERSION   20
    #define OLESTR_(str)       L##str
    #define MOLE( STR )        OLESTR_(#STR)
    #define MAKE_OLESTR(STR)      MOLE(STR)
    
    REGMAP_ENTRY(MAKE_OLESTR(VERSION), MAKE_OLESTR(MY_MAJOR_VERSION))
    

    preprocesses to (as shown by cl /E test.c):

    REGMAP_ENTRY(L"VERSION", L"20")
    

    which seems to be what you want.

    You may want to post something that can reproduced using a command line compile.