【问题标题】:Preprocessor macro GCC: pasting x and x does not give a valid preprocessing token预处理器宏 GCC:粘贴 x 和 x 不会给出有效的预处理令牌
【发布时间】:2011-06-07 18:08:01
【问题描述】:
#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”和“.”没有给出有效的预处理令牌

【问题讨论】:

  • ## 运算符的连接不适用于GCC 中的"foo" 等字符串文字。你到底想用这个宏做什么?
  • 你有没有找到一个可接受的答案来解决这个问题?
  • 有趣。我希望两者都会给出像 unable to find include file "CONCATTHREE(PATH ,FILNAME ,.h)" 这样的错误,这实际上是我通过 gcc 运行您的代码时看到的...

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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多