3

该宏#define MAX 80相当于const int MAX = 80;Both are constant,不能修改。

使用宏而不是常量整数不是更好吗?常量整数占用内存。宏的名称被预处理器替换为它的值,对吧?所以它不会占用内存。

为什么我要使用 const int 而不是宏?

4

4 回答 4

13

原因 #1:范围界定。宏完全忽略范围。

namespace SomeNS {

enum Functor {
  MIN = 0
  , AVG = 1
  , MAX = 2
};

}

如果上面的代码恰好在MAX宏定义之后包含在一个文件中,它会很高兴地被预处理成80 = 2,并且编译失败。

此外,const变量是类型安全的,可以用常量表达式安全地初始化(不需要括号)等。

另请注意,当编译器在使用它时可以访问const变量的定义时,它可以“内联”它的值。所以如果你从不取它的地址,它甚至不需要占用空间。

于 2013-06-17T13:37:15.010 回答
4

其实有几个原因:

  • 范围:您不能为宏定义范围。它存在于全球范围内,时期。因此,您不能拥有特定于类的常量,不能拥有私有常量等。此外,如果您最终声明了与您甚至没有的宏名称相同的东西,您可能会遇到名称冲突知道存在(在某些 lib/header 中包含 fe)

  • 调试:由于预处理器只是用它的值替换宏的实例,因此很难知道为什么你会遇到特定值的错误(或者只是你没想到的特定行为......)。你必须记住这个值是从哪里来的。在可重用代码的情况下更为重要,因为如果它已被定义为您未编写的标头中的宏,您甚至无法理解值的来源(因此它不是很好)自己做这个)

  • Adresses:一个 const 变量是一个变量。这意味着您可以传递它的地址(当需要 const 指针或 const 引用时),但不能使用宏

  • 类型安全:您可以为 const 变量指定类型,而不能为宏指定类型。

作为一般规则,我会说(在我看来)#define当您有明确的替代方案(即 const 变量、枚举、内联)时,您应该避免使用指令。

于 2013-06-17T13:41:48.223 回答
3

问题是它们不一样。宏只是预处理器的文本替换,而const是普通变量。

如果有人试图MAX在一个函数中隐藏(比如),当是一个宏const in MAX = 32;时,他们会收到一个非常奇怪的错误消息。MAX

在 C++ 中,语言惯用的方法是使用常量而不是宏。试图节省几个字节的内存(如果它甚至可以节省它们)似乎不值得为可读性付出代价。

于 2013-06-17T13:39:02.680 回答
2

1)调试对我来说是主要的。调试器很难MAX在运行时解析该值,但它可以使用const int版本来解决。

2) 您不会通过#define 获得任何类型信息。如果您使用的是基于模板的函数;说出std::max你的其他数据在哪里,const int然后宏版本会失败,但const int版本不会。要解决这个问题,您必须使用#define MAX 80U丑陋的。

3) 你不能用#define 控制范围;它将应用于#define 语句之后的整个编译单元。

于 2013-06-17T13:34:47.757 回答