在各种C代码中,我看到常量定义如下:
#define T 100
而在C++示例中,它几乎总是:
const int T = 100;
我的理解是,在第一种情况下,预处理器将用100替换T的每个实例。在第二个示例中,T实际上存储在内存中。
在C++中定义常量被认为是糟糕的编程实践吗?
发布于 2010-11-05 10:24:08
在第二种情况下,并不要求将T
存储在“内存中”,除非您执行诸如获取它的地址之类的操作。所有变量都是如此。
第二个更好的原因是,第一个在预处理器阶段经常“消失”,因此编译器阶段永远看不到它(因此不会在调试信息中给你提供它)。但这种行为并不是标准所要求的,而是一种常见的做法。
除了用于条件编译之外,几乎不需要使用#define
语句。单个常量可以用const
实现,多个相关的常量可以用enum
实现,宏可以用inline
函数替换。
发布于 2010-11-05 10:20:40
是。至少,使用枚举。const int
和enum
都将在编译时进行计算,因此您具有相同的性能。然而,它更干净,更容易调试(调试器实际上知道T是什么),它是类型安全的,并且不太可能中断复杂的表达式。
发布于 2010-11-05 10:25:09
是。最大的原因是预处理器定义不遵守语言的作用域规则,污染了全局名称空间,更糟糕的是,它们甚至在以下情况下被替换
x->sameNameAsPreprocessorToken
由于在文本级别替换了预处理器定义,因此变量的其他常规属性不适用-您可以使用int常量的地址,但不能使用#define'd常量的地址。
正如其他人所指出的,您通常还会失去类型安全和调试能力。
https://stackoverflow.com/questions/4103086
复制相似问题