繁体   English   中英

#在 C++ 中定义常量

[英]#defining constants in C++

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

#define T 100

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

const int T = 100;

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

在 C++ 中 #define 常量被认为是不好的编程习惯吗?

在 C++ 中 #define 常量被认为是不好的编程习惯吗?

是的,因为所有的宏(这是#define定义的)都在一个命名空间中并且它们在任何地方都有效。 变量,包括const限定的变量,可以封装在类和命名空间中。

在 C 中使用宏是因为在 C 中,一个const限定的变量实际上并不是一个常量,它只是一个不能修改的变量。 例如, const限定的变量不能出现在常量表达式中,因此它不能用作数组大小。

在 C++ 中,使用常量表达式(如const int x = 5 * 2; )初始化的const限定对象一个常量,可以在常量表达式中使用,因此您可以并且应该使用它们。

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

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

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

由于 C 和 C++ 中常量概念的不同,在 C 中我们基本上大部分时间都被迫使用#define (或enum )。 const在大多数情况下在 C 中不起作用。

但是在 C++ 中没有这样的问题,所以在 C++ 中依赖#define d 常量确实是不好的做法(除非出于某种原因你真的需要一个文本替换的常量)。

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

预处理器宏不考虑范围- 这是一个简单的文本替换 - 而static const int blah = 1; 可以包含在命名空间中。 编译器仍会优化这两种情况(除非您获取该变量的地址),但它是类型和范围安全的。

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

x->sameNameAsPreprocessorToken

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

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

另一个很酷的一点是全局整数常量可以被编译器优化掉,这样它们就不会占用任何空间(即内存)。 因此,它们在使用时可以被视为文字常量,并且与基于#define的常量一样优化,而没有所有预处理器问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM