Ton*_*roy 233
一切的利弊,取决于用法:
enum class X由范围消除歧义X::int但可以由程序员显式设置template <typename T> void f(T t) { cout << ++t; }不会编译,尽管您可以将枚举包装到具有隐式构造函数的类中,转换运算符和用户定义的运算符)template <typename T> void f(T)当从不同的枚举中传递相同的数值时,获得一个独特的实例化,所有这些都不同于任何实际的f(int)实例化.每个函数的目标代码可以是相同的(忽略地址偏移),但我不希望编译器/链接器消除不必要的副本,但是如果你关心你可以检查你的编译器/链接器.enum { A = 1, B = 2 }- A|B从程序逻辑是"合法的"透视?)make而其他基于时间戳的重新编译工具将在更改时触发客户端重新编译(糟糕! )#defineala #define S std::string("abc"),但常量避免在每个使用点重复构造不同的临时值const值,如果在两者之间切换,则最小化工作和影响#define X "x"和一些客户端使用ala "pre" X "post",如果你想或需要使X成为运行时可更改的变量而不是常量,则强制编辑客户端代码(而不仅仅是重新编译),而这种转换更容易从a const char*或const std::string给定它们已经迫使用户把串联操作(例如"pre" + X + "post"对于string)sizeof直接在定义的数字文字上使用unsigned){ 1, 2 }可用于初始化数组,或#define MICROSECONDS *1E-6等等.(绝对不推荐这个!)__FILE__,__LINE__可以并入宏观替代#if语句中存在和值是否有条件地包括代码(比预处理后"if"更强大,因为如果预处理器没有选择代码就不需要编译),使用#undef-ine,重新定义等.make其他基于时间戳的重新编译工具将在更改时触发客户端重新编译(错误!)作为一般规则,我使用consts并认为它们是一般用法的最专业选项(尽管其他人对这个老惰性程序员有一个简单的吸引力).
T.E*_*.D. 133
就个人而言,我讨厌预处理器,所以我总是选择const.
#define的主要优点是它不需要存储在程序中的内存,因为它实际上只是用文字值替换了一些文本.它还具有没有类型的优点,因此它可以用于任何整数值而不会产生警告.
"const"的优点是它们可以作用域,并且可以在需要传递指向对象的指针的情况下使用它们.
我不知道你对"静态"部分到底发生了什么.如果你在全局声明,我会把它放在一个自治命名空间而不是静态.例如
namespace {
unsigned const seconds_per_minute = 60;
};
int main (int argc; char *argv[]) {
...
}
Run Code Online (Sandbox Code Playgroud)
AnT*_*AnT 45
如果这是一个C++问题并且它#define作为替代提及,则它是关于"全局"(即文件范围)常量,而不是关于类成员.当谈到C++中的这些常量static const是多余的.在C++中const,默认情况下有内部链接,声明它们没有意义static.所以这真的是关于constvs #define..
最后,在C++中const更可取.至少因为这些常量是键入和作用域的.有根本没有理由喜欢#define上const从少数例外,一边.
字符串常量BTW是此类异常的一个示例.使用#defined字符串常量,可以使用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;
Run Code Online (Sandbox Code Playgroud)
PS再次,以防万一有人提到static const作为替代#define,它通常意味着他们在谈论C,而不是C++.我想知道这个问题是否被正确标记了......
使用静态const就像在代码中使用任何其他const变量一样.这意味着您可以跟踪信息来自何处,而不是在预编译过程中将简单地替换为代码的#define.
您可能需要查看此问题的C++ FAQ Lite:http: //www.parashift.com/c++-faq-lite/newbie.html#faq-29.7
通常你应该更喜欢 static consts。它没有任何缺点。预处理器应该主要用于条件编译(有时可能用于非常肮脏的技巧)。
#define can lead to unexpected results:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Outputs an incorrect result:
y is 505
z is 510
Run Code Online (Sandbox Code Playgroud)
However, if you replace this with constants:
#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;
}
Run Code Online (Sandbox Code Playgroud)
It outputs the correct result:
y is 505
z is 1010
Run Code Online (Sandbox Code Playgroud)
This is because #define simply replaces the text. Because doing this can seriously mess up order of operations, I would recommend using a constant variable instead.