C宏:显然无用宏的优点/意图

时间:2013-01-31 15:50:27

标签: c macros

我在C编程方面有一些经验,但我不敢称自己精通。 最近,我遇到了以下宏:

#define CONST(x) (x)

我发现它通常用于表达式,例如:

double x, y;
x = CONST(2.0)*y;

完全被这个宏的观点所困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么。我错过了什么吗?

7 个答案:

答案 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”的东西与常数无关,但与其他东西有关。寻找代码的其余部分以了解作者为何将其称为CON​​ST。

答案 6 :(得分:0)

这个宏确实具有在宏扩展期间围绕x括起括号的效果。

我猜有人试图允许某些内容

CONST(3+2)*y

,没有parens,将成为

3+2*y

但随着parens成为

(3+2)*y

我似乎记得在之前的开发生命周期中我们需要这样的东西。