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

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


当前回答

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

其他回答

#define会导致意想不到的结果:

#include <iostream>

#define x 500
#define y x + 5

int z = y * 2;

int main()
{
    std::cout << "y is " << y;
    std::cout << "\nz is " << z;
}

输出错误的结果:

y is 505
z is 510

然而,如果你用常量替换它:

#include <iostream>

const int x = 500;
const int y = x + 5;

int z = y * 2;

int main()
{
    std::cout << "y is " << y;
    std::cout << "\nz is " << z;
}

它输出正确的结果:

y is 505
z is 1010

这是因为#define只是替换了文本。因为这样做会严重打乱操作的顺序,所以我建议使用常量变量。

如果这是一个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++。我不知道这个问题是否标注正确…

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

作为一个相当老和生疏的C程序员,他从来没有完全学会c++,因为其他东西出现了,现在正在努力掌握Arduino,我的观点很简单。

#define是一个编译器预处理器指令,应该这样使用,用于条件编译等。例如,低级代码需要定义一些可能的替代数据结构,以移植到特定的硬件。它会根据模块编译和链接的顺序产生不一致的结果。如果你需要某些东西在范围上是全局的,那么就这样正确地定义它。

Const和(static Const)应该总是用来命名静态值或字符串。它们是类型化的、安全的,调试器可以完全使用它们。

枚举总是让我感到困惑,所以我设法避免使用它们。

使用静态const就像在代码中使用任何其他const变量一样。这意味着您可以跟踪信息的来源,而不是在预编译过程中简单地在代码中替换#define。

对于这个问题,你可能想看看c++ FAQ Lite: http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7