首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >#在C++中定义常量

#在C++中定义常量
EN

Stack Overflow用户
提问于 2010-11-05 10:16:04
回答 4查看 61.3K关注 0票数 32

在各种C代码中,我看到常量定义如下:

代码语言:javascript
复制
#define T 100

而在C++示例中,它几乎总是:

代码语言:javascript
复制
const int T = 100;

我的理解是,在第一种情况下,预处理器将用100替换T的每个实例。在第二个示例中,T实际上存储在内存中。

在C++中定义常量被认为是糟糕的编程实践吗?

EN

回答 4

Stack Overflow用户

发布于 2010-11-05 10:24:08

在第二种情况下,并不要求将T存储在“内存中”,除非您执行诸如获取它的地址之类的操作。所有变量都是如此。

第二个更好的原因是,第一个在预处理器阶段经常“消失”,因此编译器阶段永远看不到它(因此不会在调试信息中给你提供它)。但这种行为并不是标准所要求的,而是一种常见的做法。

除了用于条件编译之外,几乎不需要使用#define语句。单个常量可以用const实现,多个相关的常量可以用enum实现,宏可以用inline函数替换。

票数 8
EN

Stack Overflow用户

发布于 2010-11-05 10:20:40

是。至少,使用枚举。const intenum都将在编译时进行计算,因此您具有相同的性能。然而,它更干净,更容易调试(调试器实际上知道T是什么),它是类型安全的,并且不太可能中断复杂的表达式。

票数 2
EN

Stack Overflow用户

发布于 2010-11-05 10:25:09

是。最大的原因是预处理器定义不遵守语言的作用域规则,污染了全局名称空间,更糟糕的是,它们甚至在以下情况下被替换

代码语言:javascript
复制
x->sameNameAsPreprocessorToken

由于在文本级别替换了预处理器定义,因此变量的其他常规属性不适用-您可以使用int常量的地址,但不能使用#define'd常量的地址。

正如其他人所指出的,您通常还会失去类型安全和调试能力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4103086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档