【发布时间】: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