#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
有任何解决方法吗?
答案 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"
请注意,在任何宏的开头或结尾都没有出现斜杠。 这就是我的工作方式,但是我不高兴...