这是C中的有效宏吗?

1 c macros

如果我使用宏:

#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在这里有帮助还是没有它?

Eli*_*sky 9

不,这不会像你期望的那样起作用.您可以通过运行代码来测试预处理器的功能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.

  • @crypto:总是有很多方法来编写任何解决方案,所以你可能会找到另一种方法.如果您总是想要打印错误消息,那么您可以将其放入包含检查的包装函数中,在出错时打印消息并返回成功/失败指示.这会将你的构造减少到类似`if(my_file_check(file1)&& my_file_check(file2))`,同时减少冗余. (3认同)