为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
蝴蝶不菲 2019-06-01 10:30:01
“静态Const”与“#Definition”vs“enum”在下面的C语句中,哪一个更适合使用?static const int var = 5;或#define var 5或enum { var = 5 };
查看完整描述

3 回答

?
守着一只汪

TA贡献1872条经验 获得超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_)开始,在仔细阅读库时,您会注意到这是(通常),后面是特定区域(库)的名称,然后有一个有意义的名称。

它通常是长篇大论的名称:)


查看完整回答
反对 回复 2019-06-01
?
Qyouu

TA贡献1786条经验 获得超11个赞

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

  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)不能在开关语句之类的地方使用;(2)和(3)都可以。
  • (1)不能用于初始化静态变量;(2)和(3)都可以。
  • (2)可以更改您不希望更改的代码,因为它是由预处理器使用的;(1)和(3)都不会产生意外的副作用。
  • 您可以检测预处理器中是否设置了(2);(1)和(3)都不允许这样做。

因此,在大多数情况下,更喜欢“enum”而不是备选方案。否则,第一个和最后一个要点很可能是控制因素-如果你需要同时满足这两个问题,你必须更努力地思考。

如果您询问的是C+,那么每次都使用选项(1)-静态Const。


查看完整回答
反对 回复 2019-06-01
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

特别是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+中)。


查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 471 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信