#define CONST_A 2
#define CONST_B 3
#define CONST_C CONST_A*CONST_B
CONST_A
和CONST_B
的实际值作为定义标志提供给gcc,所以我不能只写#define CONST_C 6
。
如果我理解正确,这将告诉预处理器将CONST_C
的任何外观替换为2*3
而不是6
,对吗?我主要担心的是性能,所以我更喜欢后者。我猜这可以通过使用static const
而不是预处理器#define
来完成。这是最好的选择吗?
提前致谢!
答案 0 :(得分:9)
不要担心C中2 * 3
等常量表达式的性能.C编译器能够通过在编译时评估它们至少20年来消除这些表达式。
static const
可能因其他原因而首选,例如类型安全或不必担心优先级(想想如果CONST_A
被定义为2+2
会发生什么),但不是表现原因。
答案 1 :(得分:0)
C说可以在编译时评估常量表达式,今天任何体面的编译器都会在编译时计算常量表达式。此编译器操作称为常量折叠。
(C99,6.6p2)“可以在翻译期间而不是运行时评估常量表达式,因此可以在常量可能的任何位置使用。”