Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;预处理器判断令牌是否为字符串?_C++_Macros_C Preprocessor - Fatal编程技术网

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,不,这是不可能的。即使你做的函数重载了。字符串文字将与数组或字符串冲突。