预处理器宏 GCC:粘贴 x 和 x 不会给出有效的预处理标记

发布于 2024-10-11 10:58:57 字数 534 浏览 9 评论 0原文

#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”和“.”没有给出有效的预处理令牌

#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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清醇 2024-10-18 10:58:57

GCC 在执行 C 标准方面更加严格:请参阅 Visual-C++ 和 gcc 之间宏 ## 连接运算符的差异http://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/Concatenation.html#Concatenation

您可以尝试 #include STRINGIFY(PATH FILNAME.h)FILNAME.h 之间缺少空格很重要)——这有效对于我来说,gcc 4.6.3。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文