预处理器宏GCC:粘贴x和x不会提供有效的预处理令牌

时间:2011-01-12 10:36:15

标签: c gcc c-preprocessor string-concatenation stringification

#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));

这个宏在VS编译器中工作正常,但不能在GCC编译器上编译:

  

错误:错误:粘贴“/”和“includefile”没有提供有效的预处理令牌

对于某些包含文件,它会给出错误:

  

错误:粘贴“includefile”和“。”不提供有效的预处理令牌

1 个答案:

答案 0 :(得分:1)

GCC在执行C标准方面更为严格:见Differences in Macro ## concatenation operator between Visual-C++ and gcchttp://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/Concatenation.html#Concatenation

您可以尝试#include STRINGIFY(PATH FILNAME.h)FILNAME.h之间的空格不足很重要) - 这对我来说非常适用于gcc 4.6.3。