无法解析条件编译块内的类函数宏

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


gcc documentation 说:

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