我有一些 C 编程经验,但我不敢称自己精通。最近,我遇到了以下宏:
#define CONST(x) (x)
我发现它通常用于表达式中,例如:
double x, y;
x = CONST(2.0)*y;
完全被这个宏的观点迷惑了,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个特定宏的用途是什么。我错过了什么吗?
如问题中所述,宏什么都不做是对的。
这看起来像是编写该代码的人强加的某种人工结构,也许是为了清楚地说明常量在哪里,并能够搜索它们?我可以看到具有可搜索常量的优势,但这不是实现该目标的最佳方式。
这也有可能是其他一些宏方案的一部分,这些宏方案要么从未实现,要么仅被部分删除。
一些(旧的)C 编译器不支持该const
关键字,这个宏很可能是对处理不同编译器的更复杂的宏序列的回忆。尽管像 in 一样使用x = CONST(2.0)*y;
是没有意义的。
您可以从 Autoconf 文档中查看此部分以获取更多详细信息。
编辑:这个宏的另一个目的可能是自定义预处理(例如用于提取和/或替换某些常量),就像 Qt 框架的元对象编译器一样。
该宏绝对没有任何好处,编写它的人一定会感到困惑。代码完全等同于x = 2.0*y;
.
当需要解决宏扩展时,这种宏实际上可能很有用。
这种需求的一个典型例子是字符串化宏。请参阅以下问题以获取示例:C Preprocessor, Stringify the result of a macro
现在,在您的特定情况下,我看不到极端文档或代码解析目的带来的好处。
另一种用途可能是将这些值保留为将来的函数调用,如下所示:
/* #define CONST(x) (x) */
#define CONST(x) some_function(x)
// ...
double x, y;
x = CONST(2.0)*y; // x = some_function(2.0)*y;
这个宏的另一个好处是这样的
result=CONST(number+number)*2;
或与比较有关的东西
result=CONST(number>0)*2;
如果这个宏有问题,可能是名字。这个“CONST”事物与常量无关,而是与其他事物有关。查找其余代码以了解作者为何将其称为 CONST 会很好。
该宏确实具有在宏扩展期间将括号括在 x 周围的效果。
我猜有人试图允许一些类似的东西
CONST(3+2)*y
如果没有括号,它将变成
3+2*y
但随着括号变成
(3+2)*y
我似乎记得我们在以前的开发生命周期中需要这样的东西。