"static const" vs "#define" vs "enum" 的比较。
"static const" vs "#define" vs "enum" 的比较。
在C语言中,下面这些语句哪一个更好使用?
static const int var = 5;
或者
#define var 5
或者
enum { var = 5 };
admin 更改状态以发布 2023年5月22日
一般说来:
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 };
忽略名称选择的问题:
- 如果你需要传递一个指针,则必须使用(1)。
- 既然(2)是一个选择,你不需要传递指针。
- (1)和(3)都在调试器的符号表中有一个符号,这使得调试更容易。更可能的是(2)将没有符号,让你不知道它是什么。
- (1)不能用作全局范围内的数组维度;(2)和(3)都可以。
- (1)不能用作函数范围内的静态数组的维度;(2)和(3)都可以。
- 在C99下,所有这些都可以用于局部数组。从技术上讲,使用(1)将意味着使用VLA(可变长度数组),虽然“var”引用的维度当然是固定的大小为5。
- (1)不能在switch语句等地方使用;(2)和(3)都可以。
- (1)不能用于初始化静态变量;(2)和(3)都可以。
- (2)可以更改您不希望由预处理器使用的代码;(1)和(3)都不会产生意外的副作用。
- 您可以检测是否已在预处理器中设置了(2);(1)和(3)都不允许。
因此,在大多数情况下,选择“枚举”而不是其他选择。否则,第一和最后一个要点可能是控制因素,如果您需要同时满足两个要点,则必须更加认真地思考。
如果您在询问有关C ++的问题,那么您每次都会使用选项(1) - 静态常量。