“静态Const”与“#Definition”vs“enum”

“静态Const”与“#Definition”vs“enum”

在下面的C语句中,哪一个更适合使用?

static const int var = 5;

#define var 5

enum { var = 5 };


蝴蝶不菲
浏览 472回答 3
3回答

守着一只汪

一般来说: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_)开始,在仔细阅读库时,您会注意到这是(通常),后面是特定区域(库)的名称,然后有一个有意义的名称。它通常是长篇大论的名称:)

Qyouu

这取决于你需要什么价值。你(以及到目前为止的其他人)忽略了第三种选择: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。

慕雪6442864

特别是C语言?在C中,正确的答案是:使用#define(或,如适当的话,enum)类的作用域和类型属性是有益的。const物体,在现实中constC中的对象(相对于C+)不是真正的常量,因此在大多数实际情况下通常是无用的。因此,在C中,选择应该由您计划如何使用常量来决定。例如,您不能使用const int对象作为case标签(而宏将工作)。你不能用const int对象作为位字段宽度(而宏可以工作)。在C89/90中,您不能使用const对象指定数组大小(而宏可以工作)。即使在C99中,您也不能使用const对象来指定数组大小,当需要非-VLA阵列。如果这对你很重要,那么它将决定你的选择。大多数时候,你别无选择,只能用#define在C中,不要忘记另一种选择,它在C中产生真正的常数-enum.在C+中const对象是真正的常量,所以在C+中,使用const变式(不需要显式)static在C+中)。
打开App,查看更多内容
随时随地看视频慕课网APP