如果我使用宏:
#define AND
Run Code Online (Sandbox Code Playgroud)
以下列方式:
if(...)
{
...
}
elseANDif(...)
{
...
}
Run Code Online (Sandbox Code Playgroud)
预处理器产生什么输出?
编辑: 我打算用:
#define TEST(params) if(...){...}else
Run Code Online (Sandbox Code Playgroud)
...中的if(...)是使用params的复杂表达式
{...}中的...执行一些操作并且与params无关
#define AND
TEST(x1) AND TEST(x2)
{
//the code for the final else
}
Run Code Online (Sandbox Code Playgroud)
AND在这里有帮助还是没有它?
不,这不会像你期望的那样起作用.您可以通过运行代码来测试预处理器的功能cpp.
eliben@eliben-desktop:~/temp$ cat z.c
#define AND
if(...)
{
...
}
elseANDif(...)
{
...
}
eliben@eliben-desktop:~/temp$ cpp z.c
# 1 "z.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "z.c"
if(...)
{
...
}
elseANDif(...)
{
...
}
Run Code Online (Sandbox Code Playgroud)
该技术的原因是,当cpp扩展宏它寻找一个完整的标识符令牌匹配该宏的名称.即在你的情况下,它寻找标识符AND.但是,当它解析代码时,它找不到这样的标识符.它找到elseANDif哪个是完全不同的标识符.它没有办法打破elseANDif成分,这是一件好事,因为否则宏会非常糟糕.想像:
const int FUSIONDEBUG = 5;
Run Code Online (Sandbox Code Playgroud)
无论这意味着什么,在真正的C代码中,这将会非常糟糕,因为NDEBUG几乎总是在生产代码中定义为空(谷歌是什么NDEBUG意思).
关于你的编辑,我可以就这些问题给你最好的建议就是不要做.(ab)使用这样的宏可能首先出现,使代码更具可读性,但从长远来看,它使得它的可读性低得多,增加的危险是宏很难完全正确并且令牌的某些组合可以吹严重对你
所以你绝对可以做到没有完全AND没有TEST.