【问题标题】:Clang Breaks with "preprocessed" includes [duplicate]带有“预处理”的Clang Breaks包括[重复]
【发布时间】:2019-09-24 21:50:00
【问题描述】:
#define STR_L(x) #x
#define STR(x) STR_L(x)

#define CAT_L(x,y) x##y
#define CAT(x,y) CAT_L(x,y)

#define FOLDER folder/

#define PLATINCLUDE(x) STR( CAT(FOLDER ,x) )

#include PLATINCLUDE(file.h) // results in #include "folder/file.h"

这适用于 GCC 和 MSVC。 然而 Clang 很愚蠢,它似乎理解该代码并且知道它是正确的,但它只是打破......

所以,如果文件不存在,它会抱怨#include "folder/file.h" 指向一个不存在的文件(如预期的那样),但如果文件存在,它会给出以下信息: Pasting formed '/file', an invalid preprocessing token

有什么解决方法吗?

【问题讨论】:

  • 在假设编译器损坏之前假设您的代码无效是个好主意。在不同的编译器上编译也不能明确说明任何事情,因为并非所有无效代码的情况都需要诊断。此外,GCC gives a similar error 和 MSVC warns 及其新的 PP 实现。

标签: c++ clang preprocessor


【解决方案1】:

好的,不知道为什么(我认为这是 Clang 上的一个错误),但问题似乎与使用斜杠 (/) 结束或开始预处理器指令有关。

所以,这行得通:

#define STR_L(x) #x
#define STR(x) STR_L(x)

#define CAT_L(x,y) x##y
#define CAT(x,y) CAT_L(x,y)

#define FOLDER folder

#define PLATINCLUDE(x) STR( CAT(FOLDER ,x) )

#include PLATINCLUDE(_ext/file.h) // results in #include "folder_ext/file.h" 

请注意斜线不在任何宏的开头或结尾。 这就是我的工作方式,但我并不高兴......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2011-08-03
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多