我在C编程方面有一些经验,但我不敢称自己精通。 最近,我遇到了以下宏:
#define CONST(x) (x)
我发现它通常用于表达式,例如:
double x, y;
x = CONST(2.0)*y;
完全被这个宏的观点所困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么。我错过了什么吗?
答案 0 :(得分:11)
如问题中所示,你是对的,宏没有做任何事情。
这看起来像编写代码的人施加的一些人为结构,可能是为了使常量非常清楚,并且能够搜索它们?我可以看到具有可搜索常量的优势,但这不是实现该目标的最佳方式。
这也可能是其他一些宏计划的一部分,这些计划要么从未实施过,要么只是部分删除。
答案 1 :(得分:6)
一些(旧的)C编译器不支持const
关键字,这个宏很可能是对处理不同编译器的更复杂的宏序列的回忆。像在x = CONST(2.0)*y;
中一样使用虽然毫无意义。
您可以查看this section from the Autoconf documentation了解详情。
编辑:此宏的另一个目的可能是自定义预处理(例如,用于提取和/或替换某些常量),如Qt Framework的Meta Object Compiler那样。
答案 2 :(得分:2)
这个宏绝对没有任何好处,无论谁编写它都必须混淆。代码完全等同于x = 2.0*y;
。
答案 3 :(得分:1)
当需要解决宏扩展问题时,这种宏实际上是有用的 这种需求的典型示例是字符串化宏。有关示例,请参阅以下问题:C Preprocessor, Stringify the result of a macro
现在在您的具体案例中,我没有看到来自极端文档或代码解析目的的好处。
答案 4 :(得分:0)
另一种用途可能是将这些值保留为将来的函数调用,如下所示:
/* #define CONST(x) (x) */
#define CONST(x) some_function(x)
// ...
double x, y;
x = CONST(2.0)*y; // x = some_function(2.0)*y;
答案 5 :(得分:0)
关于这个宏的另一个好处就是这样的
result=CONST(number+number)*2;
或与比较有关的事情
result=CONST(number>0)*2;
如果此宏存在问题,则可能是名称。这个“CONST”的东西与常数无关,但与其他东西有关。寻找代码的其余部分以了解作者为何将其称为CONST。
答案 6 :(得分:0)
这个宏确实具有在宏扩展期间围绕x括起括号的效果。
我猜有人试图允许某些内容
CONST(3+2)*y
,没有parens,将成为
3+2*y
但随着parens成为
(3+2)*y
我似乎记得在之前的开发生命周期中我们需要这样的东西。