您好所有,在C++中,定义整个应用程序中使用的常数,你是什么人通常的做法?
#define WINDOWS_HEIGHT 1024
或
const int WINDOWS_HEIGHT = 1024;
感谢。
您好所有,在C++中,定义整个应用程序中使用的常数,你是什么人通常的做法?
#define WINDOWS_HEIGHT 1024
或
const int WINDOWS_HEIGHT = 1024;
感谢。
利弊一切,取决于用途:
template <typename T> void f(T t) { cout << ++t; }
将不会编译)template <typename T> void f(T)
从不同的枚举中传递相同的数值时会得到不同的实例化,所有这些都与任何实际的f(int)实例不同。#define X "x"
和一些客户使用阿拉"pre" X "post"
,你就麻烦了,如果你想要或需要做X运行时可改变的变量,而不是一个常数,而这种转变是从const char*
容易或const std::string
,因为它们已经强制用户并入级联操作。{ 1, 2 }
,或#define MICROSECONDS *1E-6
等(绝对不推荐这个!)__FILE__
和__LINE__
一些特殊的东西可以掺入宏替换作为一般规则,我用consts并考虑将其用于一般用途最专业的选择(尽管该有的都有了一个简单呼吁这个老懒惰的程序员)。
我的投票是'namespace scope extern const'变量在一个ane中定义的只有一个翻译单元。命名空间范围'const'变量具有内部链接。
嗯,取决于。对于整型常量enum
效果很好。例如:
struct Constants {
enum {
WindowHeight = 8,
WindowWidth = 8,
// ...
};
};
...
int h = Constants::WindowHeight;
使用常量整数;它将显示在调试器中#define值可能不存在的地方。或者使用枚举;那也可以。
我使用命名空间范围extern const。
使用define可以简单地用您的代码替换所有出现的值。常量全局变量几乎相同,只有类型可以明确定义。这几乎是唯一的区别。
就我个人而言,我宁愿使用一个定义,只是出于品味。
但是,我认为没有什么区别。
调试器将无法对宏执行任何操作。 – 2010-09-30 03:34:27
@Martin,这不一定是真的。 gdb支持[宏扩展](http://www.delorie。COM/GNU /文档/ GDB/gdb_70.html)。 – 2010-09-30 03:37:41
参见[ static const vs #define ](http://stackoverflow.com/questions/1637332/static-const-vs-define)。 – 2010-09-30 03:41:08