21

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

#define CONST(x) (x)

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

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

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

4

7 回答 7

11

如问题中所述,宏什么都不做是对的。

这看起来像是编写该代码的人强加的某种人工结构,也许是为了清楚地说明常量在哪里,并能够搜索它们?我可以看到具有可搜索常量的优势,但这不是实现该目标的最佳方式。

这也有可能是其他一些宏方案的一部分,这些宏方案要么从未实现,要么仅被部分删除。

于 2013-01-31T15:54:32.600 回答
6

一些(旧的)C 编译器不支持该const关键字,这个宏很可能是对处理不同编译器的更复杂的宏序列的回忆。尽管像 in 一样使用x = CONST(2.0)*y;是没有意义的。

您可以从 Autoconf 文档中查看此部分以获取更多详细信息。

编辑:这个宏的另一个目的可能是自定义预处理(例如用于提取和/或替换某些常量),就像 Qt 框架的元对象编译器一样。

于 2013-01-31T16:18:42.587 回答
2

该宏绝对没有任何好处,编写它的人一定会感到困惑。代码完全等同于x = 2.0*y;.

于 2013-01-31T15:54:11.853 回答
1

当需要解决宏扩展时,这种宏实际上可能很有用。
这种需求的一个典型例子是字符串化宏。请参阅以下问题以获取示例:C Preprocessor, Stringify the result of a macro

现在,在您的特定情况下,我看不到极端文档或代码解析目的带来的好处。

于 2013-01-31T16:05:10.197 回答
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;
于 2013-01-31T16:06:03.480 回答
0

这个宏的另一个好处是这样的

result=CONST(number+number)*2;

或与比较有关的东西

result=CONST(number>0)*2;

如果这个宏有问题,可能是名字。这个“CONST”事物与常量无关,而是与其他事物有关。查找其余代码以了解作者为何将其称为 CONST 会很好。

于 2013-01-31T20:14:18.410 回答
0

该宏确实具有在宏扩展期间将括号括在 x 周围的效果。

我猜有人试图允许一些类似的东西

CONST(3+2)*y

如果没有括号,它将变成

3+2*y

但随着括号变成

(3+2)*y

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

于 2013-02-07T19:08:32.097 回答