无法解析条件编译块内的类函数宏
Cannot resolve function-like macro inside conditional compilation block
考虑以下 - 我想检查 #if
#endif
是否
令牌在代码中的某处定义。
我正在使用 CONCAT(input)
宏,它应该粘附我要检查的令牌的常量和变化部分。
不幸的是,下面介绍的方法会导致编译错误:
error: missing binary operator before token "("
我找到了可以放在 #if
#endif
块中的表达式:
https://gcc.gnu.org/onlinedocs/cpp/If.html#If
显然它指出:
宏。在表达式值的实际计算开始之前,表达式中的所有宏都会展开。
原来(CONCAT(test))
应该解决了,结果没有
是否有任何解决方法允许在条件编译块中正确解析连接的标记名称?
#include <stdio.h>
#define CONCAT(input) string##input
#define stringtest 1
int main(void)
{
#if defined(CONCAT(test)) && (CONCAT(test)==1)
printf("OK");
#else
printf("NOT");
#endif
return 0;
}
你不能那样做。只能使用文字。
您应该直接检查宏:
#include <stdio.h>
#define CONCAT(input) string##input
#define stringtest 1
int main(void) {
#if stringtest == 1
printf("OK");
#else
printf("NOT");
#endif
return 0;
}
因为你不需要定义检查,你可以这样使用:
#define CONCAT(input) string##input
#define stringtest 1
int main(void) {
#if CONCAT(test) == 1
printf("OK");
#else
printf("NOT");
#endif
return 0;
}
如果您只使用:#if CONCAT(test) == 1
,它将起作用并且足够了。
语句 #if defined(CONCAT(test))
不 有效,因为 CONCAT(test)
将被计算为 stringtest
,而 stringtest
将被计算为 1
,您可以对数字常量使用 defined
。
A different situation came to my mind - what if I want to check whether the token is eg. != 1 Then if it is not defined anywhere, the condition will evaluate to true. So there would be no difference between token not defined and token being different than 1.
您可以处理 == 0
等于 to not defined
。所以你可以使用:#if CONCAT(test) != 0 && CONCAT(test) != 1
其中 CONCAT(test) != 0
表示 defined(CONCAT(test))
。这是唯一的选择,因为您无法在 #ifdef
或 #if defined()
语句中进行宏扩展,请参阅与您的非常相似的 question。
Conditionals written like this:
#if defined BUFSIZE && BUFSIZE >= 1024
can generally be simplified to just #if BUFSIZE >= 1024
, since if BUFSIZE
is not defined, it will be interpreted as having the value zero.
如果您使用 gcc -E yourSource.cpp
.
检查宏扩展,这也会有所帮助
gcc --help:
-E Preprocess only; do not compile, assemble or link
考虑以下 - 我想检查 #if
#endif
是否
令牌在代码中的某处定义。
我正在使用 CONCAT(input)
宏,它应该粘附我要检查的令牌的常量和变化部分。
不幸的是,下面介绍的方法会导致编译错误:
error: missing binary operator before token "("
我找到了可以放在 #if
#endif
块中的表达式:
https://gcc.gnu.org/onlinedocs/cpp/If.html#If
显然它指出:
宏。在表达式值的实际计算开始之前,表达式中的所有宏都会展开。
原来(CONCAT(test))
应该解决了,结果没有
是否有任何解决方法允许在条件编译块中正确解析连接的标记名称?
#include <stdio.h>
#define CONCAT(input) string##input
#define stringtest 1
int main(void)
{
#if defined(CONCAT(test)) && (CONCAT(test)==1)
printf("OK");
#else
printf("NOT");
#endif
return 0;
}
你不能那样做。只能使用文字。
您应该直接检查宏:
#include <stdio.h>
#define CONCAT(input) string##input
#define stringtest 1
int main(void) {
#if stringtest == 1
printf("OK");
#else
printf("NOT");
#endif
return 0;
}
因为你不需要定义检查,你可以这样使用:
#define CONCAT(input) string##input
#define stringtest 1
int main(void) {
#if CONCAT(test) == 1
printf("OK");
#else
printf("NOT");
#endif
return 0;
}
如果您只使用:#if CONCAT(test) == 1
,它将起作用并且足够了。
语句 #if defined(CONCAT(test))
不 有效,因为 CONCAT(test)
将被计算为 stringtest
,而 stringtest
将被计算为 1
,您可以对数字常量使用 defined
。
A different situation came to my mind - what if I want to check whether the token is eg. != 1 Then if it is not defined anywhere, the condition will evaluate to true. So there would be no difference between token not defined and token being different than 1.
您可以处理 == 0
等于 to not defined
。所以你可以使用:#if CONCAT(test) != 0 && CONCAT(test) != 1
其中 CONCAT(test) != 0
表示 defined(CONCAT(test))
。这是唯一的选择,因为您无法在 #ifdef
或 #if defined()
语句中进行宏扩展,请参阅与您的非常相似的 question。
Conditionals written like this:
#if defined BUFSIZE && BUFSIZE >= 1024
can generally be simplified to just
#if BUFSIZE >= 1024
, since ifBUFSIZE
is not defined, it will be interpreted as having the value zero.
如果您使用 gcc -E yourSource.cpp
.
gcc --help:
-E Preprocess only; do not compile, assemble or link