“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 };
  • 忽略关于名称选择的问题,那么:

  • 如果你需要传递一个指针,你必须使用(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)都不允许。
  • 所以,在大多数情况下,更喜欢'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 )。

    链接地址: http://www.djcxy.com/p/21071.html

    上一篇: "static const" vs "#define" vs "enum"

    下一篇: String.Join vs. StringBuilder: which is faster?