使用静态const变量比使用#define preprocessor更好吗?或者这取决于上下文?

每种方法的优点/缺点是什么?


当前回答

如果这是一个c++问题,并且它提到了#define作为替代,那么它是关于“全局”(即文件范围)常量,而不是关于类成员。当涉及到c++中的这些常量时,静态const是多余的。在c++中,const默认具有内部链接,没有必要将它们声明为静态。这是关于const和#define的问题。

最后,在c++中,const更可取。至少因为这些常量是有类型和作用域的。除了少数例外情况外,根本没有理由更喜欢#define而不是const。

字符串常量,顺便说一句,就是这种例外的一个例子。使用#定义的字符串常量,可以使用C/ c++编译器的编译时连接特性,例如

#define OUT_NAME "output"
#define LOG_EXT ".log"
#define TEXT_EXT ".txt"

const char *const log_file_name = OUT_NAME LOG_EXT;
const char *const text_file_name = OUT_NAME TEXT_EXT;

另外,以防万一,当有人提到静态const作为#define的替代品时,通常意味着他们在谈论C,而不是c++。我不知道这个问题是否标注正确…

其他回答

总是喜欢使用语言特性,而不是一些额外的工具,如预处理器。

ES.31:不要将宏用于常量或“函数” 宏是bug的主要来源。宏不服从通常的作用域 以及类型规则。宏不遵循通常的参数规则 传递。宏确保人类读者看到不同的东西 从编译器看到的。宏使工具构建复杂化。

来自c++核心指南

请看这里:static const vs define

通常使用const声明(注意它不需要是静态的)

就我个人而言,我讨厌预处理器,所以我总是使用const。

#define的主要优点是它不需要在程序中存储内存,因为它实际上只是用文字值替换一些文本。它还具有没有类型的优点,因此可以用于任何整数值而不会产生警告。

“const”的优点是它们可以有作用域,并且可以在需要传递指向对象的指针的情况下使用。

我不知道你说的“静态”到底是什么意思。如果是全局声明,我会把它放在匿名名称空间中,而不是使用静态名称空间。例如

namespace {
   unsigned const seconds_per_minute = 60;
};

int main (int argc; char *argv[]) {
...
}

如果要定义一个在类的所有实例之间共享的常量,请使用static const。如果常量特定于每个实例,则只需使用const(但请注意,该类的所有构造函数都必须在初始化列表中初始化这个const成员变量)。

使用预处理器指令#define定义常量不仅不建议应用在c++中,也不建议应用在C中。甚至在C语言中,也有人建议用const表示常量。