“static const”vs“#define”vs“enum”
在C中的下面的语句中使用哪一个更好?
static const int var = 5;
要么
#define var 5
要么
enum { var = 5 };
一般来说:
static const
因为它尊重范围并且是类型安全的。
唯一的警告我可以看到:如果你想要的变量可能在命令行定义。 还有一个选择:
#ifdef VAR // Very bad name, not long enough, too general, etc..
static int const var = VAR;
#else
static int const var = 5; // default value
#endif
只要有可能,而不是宏/省略号,请使用类型安全的替代方法。
如果你真的需要用宏(例如,你想要__FILE__
或__LINE__
),那么你最好仔细命名你的宏:在它的命名约定中,Boost建议所有大写,从项目名称开始(这里BOOST_),而仔细阅读库,你会注意到这是(通常)后面是特定区域(库)的名称,然后是一个有意义的名称。
它通常使漫长的名字:)
这取决于你需要什么价值。 你(以及其他所有人)都省略了第三种选择:
static const int var = 5;
#define var 5
enum { var = 5 };
忽略关于名称选择的问题,那么:
所以,在大多数情况下,更喜欢'enum'而不是替代品。 否则,第一个和最后一个要点可能是控制因素 - 如果你需要同时满足这两个要点,你必须更加努力地思考。
如果您问的是C ++,那么您每次都会使用选项(1) - 静态常量。
在C中,具体是什么? 在C中,正确的答案是:使用#define
(或者,如果适用, enum
)
虽然具有const
对象的范围和类型属性是有益的,但实际上C中的const
对象(与C ++相反)不是真正的常量,因此在大多数实际情况下通常是无用的。
因此,在C中,选择应该取决于你打算如何使用常数。 例如,不能将const int
对象用作case
标签(而宏将起作用)。 您不能使用const int
对象作为位域宽度(而宏将起作用)。 在C89 / 90中,不能使用const
对象来指定数组大小(而宏将起作用)。 即使在C99中,当需要非VLA数组时,也不能使用const
对象来指定数组大小。
如果这对你很重要,那么它将决定你的选择。 大多数情况下,除了在C中使用#define
别无选择。不要忘记另一种替代方法,它会在C - enum
中生成真正的常量。
在C ++中, const
对象是真正的常量,所以在C ++中,选择const
变量几乎总是更好(不需要C ++中的显式static
)。