"static const" vs "#define" vs "enum" 的比较。

20 浏览
0 Comments

"static const" vs "#define" vs "enum" 的比较。

在C语言中,下面这些语句哪一个更好使用?

static const int var = 5;

或者

#define var 5

或者

enum { var = 5 };

admin 更改状态以发布 2023年5月22日
0
0 Comments

一般说来:

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_)开头,然后是库的名称(一般)跟着有意义的名称。

通常会产生很长的名称:)

0
0 Comments

它取决于你需要这个值的目的。你(和其他人)都忽略了第三个选择:

  1. static const int var = 5;
  2. #define var 5
  3. 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) - 静态常量。

0