带有“预处理”的Clang中断包括

时间:2019-09-24 21:50:00

标签: c++ clang preprocessor

#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

有任何解决方法吗?

1 个答案:

答案 0 :(得分:0)

好吧,不知道为什么(我认为这是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" 

请注意,在任何宏的开头或结尾都没有出现斜杠。 这就是我的工作方式,但是我不高兴...