Preprocessor macro GCC: pasting x and x does not give a valid preprocessing token

SoccerKid picture SoccerKid · Jan 12, 2011 · Viewed 9.1k times · Source
#define  PATH  "yagh/headers/"
#define  FILNAME  "includefile"


#define CONCAT(a__, b__) CONCAT_DO(a__, b__)
#define CONCAT_DO(a__, b__) a__##b__
#define CONCATTHREE(a__, b__, c__) CONCAT(CONCAT(a__, b__), c__)
#define STRINGIFY(a__) #a__


#include STRINGIFY(CONCATTHREE(PATH  ,FILNAME  ,.h));

This macro works fine in VS compiler but does not compile on GCC compiler:

Error: error: pasting "/" and "includefile" does not give a valid preprocessing token

and for some include files it gives the error:

Error: pasting "includefile" and "." does not give a valid preprocessing token

Answer

bks picture bks · Oct 7, 2013

GCC is being a bit stricter in enforcing the C standard: see Differences in Macro ## concatenation operator between Visual-C++ and gcc and http://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/Concatenation.html#Concatenation.

You might try #include STRINGIFY(PATH FILNAME.h) (the lack of space between FILNAME and .h is important) -- that works for me with gcc 4.6.3.