Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Macros_C Preprocessor_Conditional Compilation_Define Syntax - Fatal编程技术网

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

C 无法解析条件编译块内类似宏的函数,c,macros,c-preprocessor,conditional-compilation,define-syntax,C,Macros,C Preprocessor,Conditional Compilation,Define Syntax,考虑以下问题-我想用#if#endif检查 令牌是在代码的某个地方定义的。 我使用的是一个CONCAT(input)宏,它应该将要检查的令牌的常量和更改部分粘合起来 不幸的是,下面介绍的方法会导致编译错误: 错误:标记“(” 我找到了可以放在#if#endif块中的表达式: 显然,它说: 宏。表达式中的所有宏在表达式值的实际计算开始之前展开 原来应该解决(CONCAT(test)),但事实并非如此 是否存在允许在条件编译块中正确解析连接的令牌名称的变通方法 #include <stdi

考虑以下问题-我想用
#if
#endif
检查 令牌是在代码的某个地方定义的。 我使用的是一个
CONCAT(input)
宏,它应该将要检查的令牌的常量和更改部分粘合起来

不幸的是,下面介绍的方法会导致编译错误:

错误:标记“(”


我找到了可以放在
#if
#endif
块中的表达式:

显然,它说:

宏。表达式中的所有宏在表达式值的实际计算开始之前展开

原来应该解决
(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;
}
#包括
#定义CONCAT(输入)字符串##输入
#定义StringTest1
内部主(空)
{
#如果定义了(CONCAT(测试))&&(CONCAT(测试)==1)
printf(“OK”);
#否则
printf(“非”);
#恩迪夫
返回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;
}
如果您只使用:
#如果CONCAT(test)==1
,它将工作并且足够。 语句
#if defined(CONCAT(test))
不起作用,因为
CONCAT(test)
将被计算为
stringtest
,它将被计算为
1
,并且不能对数值常量使用
defined

我想到了一个不同的情况——如果我想检查令牌是否为eg.!=1,那么如果它在任何地方都没有定义,那么条件将计算为true。因此,未定义令牌和不同于1的令牌之间没有区别

您可以将
==0
处理为未定义的
。因此您可以使用:
#if CONCAT(test)!=0&&CONCAT(test)!=1
其中
CONCAT(test)!=0
表示
已定义(CONCAT(test))
。这是唯一的选择,因为在
#ifdef
#if defined()
语句中无法进行宏扩展,请参见与您的语句非常类似的内容


报告说:

这样写的条件句:
#如果定义了BUFSIZE&&BUFSIZE>=1024

通常可以简化为
#如果BUFSIZE>=1024
,因为如果未定义
BUFSIZE
,它将被解释为值为零

如果您使用
gcc-E yourSource.cpp
检查宏扩展,也会很有帮助

gcc——帮助:

-仅处理预处理;不编译、组装或链接


我想你不能这么做。顺便说一句,这是多余的。
#如果stringtest==1
就足够了。谢谢你的简单建议。我想到了一个不同的情况-如果我想检查令牌是否为例如
!=1
,那么如果它没有在任何地方定义,条件将计算为true。因此,不会有任何区别ween令牌未定义,且令牌与1不同。对于这种情况,您有什么建议吗?我编辑了我的答案以满足您的附加问题,希望这对您有所帮助。
#define CONCAT(input) string##input
#define stringtest 1

int main(void) {
    #if CONCAT(test) == 1
        printf("OK");
    #else
        printf("NOT");
    #endif
    return 0;
}