C++ C++;预处理器判断令牌是否为字符串?
预处理器宏是否可以确定其参数是否为字符串(文字) 例如:C++ C++;预处理器判断令牌是否为字符串?,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,预处理器宏是否可以确定其参数是否为字符串(文字) 例如: #define IS_STRING(token) ??? IS_STRING("foo") // expands to 1 IS_STRING(foo) // expands to 0 对。但在输出上有一点差异: #define IS_STRING(token) "" token 对于stringliteral,它会很好。对于非字符串,它将给出编译器错误 逻辑:编译器自动连接字符串文字,因此如果标记是字符串文字,则标记可以
#define IS_STRING(token) ???
IS_STRING("foo") // expands to 1
IS_STRING(foo) // expands to 0
对。但在输出上有一点差异:
#define IS_STRING(token) "" token
对于stringliteral,它会很好。对于非字符串,它将给出编译器错误
逻辑:编译器自动连接字符串文字,因此如果标记
是字符串文字,则标记
可以正常工作
.您想用这些信息做什么?在C++(11)中可能有一个编译时方法。我不认为预处理器有这样的功能。我正在尝试根据预处理器宏的第一个参数是否是字符串来重载预处理器宏。不过,我刚刚意识到,我的方法是有缺陷的,因为没有任何东西可以阻止宏的用户声明一个命名的
const char*
,并传递它,而不是字符串文本,在这种情况下,将调用错误的重载…不能重载宏。请参阅答案。您如何让它根据参数的数量做一些不同的事情?对于C++03,基于到char*
的转换,这是可能的。如果它隐式转换为char*
,并且类型为char const[N]
,则它是一个字符串文本。但是,它是在编译器级别上,而不是在预处理器级别上。有没有一种方法不会对其中一种情况产生编译器错误?@HighCommander4,不,这是不可能的。即使你做的函数重载了。字符串文字将与数组或字符串冲突。