3

抱歉,如果这个问题看起来很幼稚,但我无法在任何地方找到明确的答案。我必须根据先前定义的常量定义一个常量,例如

#define CONST_A 2
#define CONST_B 3
#define CONST_C CONST_A*CONST_B

CONST_A和的实际值CONST_B作为defineflags提供给gcc,所以我不能只写#define CONST_C 6.

如果我理解正确,这将告诉预处理器替换CONST_Cby2*3和 not的任何外观6,对吗?我主要担心性能,所以我更喜欢后者。我猜这可以通过使用static const而不是 preprocessor来完成#define。这是最好的选择吗?

提前致谢!

4

2 回答 2

9

不必担心像2 * 3C 中那样的常量表达式的性能。C 编译器至少 20 年来一直能够通过在编译时评估它们来消除这些表达式。

static const可以出于其他原因首选,例如类型安全或不必担心优先级(想想如果CONST_A定义为会发生什么2+2),但不是出于性能原因。

于 2013-01-10T11:05:56.453 回答
0

C 说常量表达式可以在编译时求值,而今天任何体面的编译器都会在编译时求值常量表达式。这种编译器操作称为常量折叠

(C99, 6.6p2) “常量表达式可以在翻译期间而不是运行时进行计算,因此可以在常量可能存在的任何地方使用。”

于 2013-01-10T11:17:29.620 回答