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;
}