一般来说: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_)开始,在仔细阅读库时,您会注意到这是(通常),后面是特定区域(库)的名称,然后有一个有意义的名称。它通常是长篇大论的名称:)
这取决于你需要什么价值。你(以及到目前为止的其他人)忽略了第三种选择:static const int var = 5;#define var 5enum { var = 5 };忽略有关名称选择的问题,然后:如果需要传递指针,则必须使用(1)。因为(2)显然是一个选项,所以不需要传递指针。在调试器的符号表中,(1)和(3)都有一个符号-这使得调试更容易。更有可能的是(2)没有符号,让你想知道它是什么。(1)不能用作全局范围内数组的维度;(2)和(3)都可以。(1)不能用作函数范围内的静态数组的维度;(2)和(3)都可以。在C99下,所有这些都可以用于本地数组。从技术上讲,使用(1)将意味着使用VLA(可变长度数组),尽管“var”引用的维度当然将固定在大小5。(1)不能在开关语句之类的地方使用;(2)和(3)都可以。(1)不能用于初始化静态变量;(2)和(3)都可以。(2)可以更改您不希望更改的代码,因为它是由预处理器使用的;(1)和(3)都不会产生意外的副作用。您可以检测预处理器中是否设置了(2);(1)和(3)都不允许这样做。因此,在大多数情况下,更喜欢“enum”而不是备选方案。否则,第一个和最后一个要点很可能是控制因素-如果你需要同时满足这两个问题,你必须更努力地思考。如果您询问的是C+,那么每次都使用选项(1)-静态Const。