该宏#define MAX 80
相当于const int MAX = 80;
Both are constant,不能修改。
使用宏而不是常量整数不是更好吗?常量整数占用内存。宏的名称被预处理器替换为它的值,对吧?所以它不会占用内存。
为什么我要使用 const int 而不是宏?
原因 #1:范围界定。宏完全忽略范围。
namespace SomeNS {
enum Functor {
MIN = 0
, AVG = 1
, MAX = 2
};
}
如果上面的代码恰好在MAX
宏定义之后包含在一个文件中,它会很高兴地被预处理成80 = 2
,并且编译失败。
此外,const
变量是类型安全的,可以用常量表达式安全地初始化(不需要括号)等。
另请注意,当编译器在使用它时可以访问const
变量的定义时,它可以“内联”它的值。所以如果你从不取它的地址,它甚至不需要占用空间。
其实有几个原因:
范围:您不能为宏定义范围。它存在于全球范围内,时期。因此,您不能拥有特定于类的常量,不能拥有私有常量等。此外,如果您最终声明了与您甚至没有的宏名称相同的东西,您可能会遇到名称冲突知道存在(在某些 lib/header 中包含 fe)
调试:由于预处理器只是用它的值替换宏的实例,因此很难知道为什么你会遇到特定值的错误(或者只是你没想到的特定行为......)。你必须记住这个值是从哪里来的。在可重用代码的情况下更为重要,因为如果它已被定义为您未编写的标头中的宏,您甚至无法理解值的来源(因此它不是很好)自己做这个)
Adresses:一个 const 变量是一个变量。这意味着您可以传递它的地址(当需要 const 指针或 const 引用时),但不能使用宏
类型安全:您可以为 const 变量指定类型,而不能为宏指定类型。
作为一般规则,我会说(在我看来)#define
当您有明确的替代方案(即 const 变量、枚举、内联)时,您应该避免使用指令。
问题是它们不一样。宏只是预处理器的文本替换,而const
是普通变量。
如果有人试图MAX
在一个函数中隐藏(比如),当是一个宏const in MAX = 32;
时,他们会收到一个非常奇怪的错误消息。MAX
在 C++ 中,语言惯用的方法是使用常量而不是宏。试图节省几个字节的内存(如果它甚至可以节省它们)似乎不值得为可读性付出代价。
1)调试对我来说是主要的。调试器很难MAX
在运行时解析该值,但它可以使用const int
版本来解决。
2) 您不会通过#define 获得任何类型信息。如果您使用的是基于模板的函数;说出std::max
你的其他数据在哪里,const int
然后宏版本会失败,但const int
版本不会。要解决这个问题,您必须使用#define MAX 80U
丑陋的。
3) 你不能用#define 控制范围;它将应用于#define 语句之后的整个编译单元。