使用静态const变量比使用#define preprocessor更好吗?或者这取决于上下文?
每种方法的优点/缺点是什么?
使用静态const变量比使用#define preprocessor更好吗?或者这取决于上下文?
每种方法的优点/缺点是什么?
当前回答
如果要定义一个在类的所有实例之间共享的常量,请使用static const。如果常量特定于每个实例,则只需使用const(但请注意,该类的所有构造函数都必须在初始化列表中初始化这个const成员变量)。
其他回答
使用静态const就像在代码中使用任何其他const变量一样。这意味着您可以跟踪信息的来源,而不是在预编译过程中简单地在代码中替换#define。
对于这个问题,你可能想看看c++ FAQ Lite: http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7
#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只是替换了文本。因为这样做会严重打乱操作的顺序,所以我建议使用常量变量。
请看这里:static const vs define
通常使用const声明(注意它不需要是静态的)
就我个人而言,我讨厌预处理器,所以我总是使用const。
#define的主要优点是它不需要在程序中存储内存,因为它实际上只是用文字值替换一些文本。它还具有没有类型的优点,因此可以用于任何整数值而不会产生警告。
“const”的优点是它们可以有作用域,并且可以在需要传递指向对象的指针的情况下使用。
我不知道你说的“静态”到底是什么意思。如果是全局声明,我会把它放在匿名名称空间中,而不是使用静态名称空间。例如
namespace {
unsigned const seconds_per_minute = 60;
};
int main (int argc; char *argv[]) {
...
}
作为一个相当老和生疏的C程序员,他从来没有完全学会c++,因为其他东西出现了,现在正在努力掌握Arduino,我的观点很简单。
#define是一个编译器预处理器指令,应该这样使用,用于条件编译等。例如,低级代码需要定义一些可能的替代数据结构,以移植到特定的硬件。它会根据模块编译和链接的顺序产生不一致的结果。如果你需要某些东西在范围上是全局的,那么就这样正确地定义它。
Const和(static Const)应该总是用来命名静态值或字符串。它们是类型化的、安全的,调试器可以完全使用它们。
枚举总是让我感到困惑,所以我设法避免使用它们。