3 回答
![?](http://img1.sycdn.imooc.com/54586653000151cd02200220-100-100.jpg)
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_)开始,在仔细阅读库时,您会注意到这是(通常),后面是特定区域(库)的名称,然后有一个有意义的名称。
它通常是长篇大论的名称:)
![?](http://img1.sycdn.imooc.com/545868190001d52602200220-100-100.jpg)
TA贡献1786条经验 获得超11个赞
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)不能在开关语句之类的地方使用;(2)和(3)都可以。 (1)不能用于初始化静态变量;(2)和(3)都可以。 (2)可以更改您不希望更改的代码,因为它是由预处理器使用的;(1)和(3)都不会产生意外的副作用。 您可以检测预处理器中是否设置了(2);(1)和(3)都不允许这样做。
![?](http://img1.sycdn.imooc.com/545847f50001126402200220-100-100.jpg)
TA贡献1812条经验 获得超5个赞
特别是C语言?在C中,正确的答案是:使用#define
(或,如适当的话,enum
)
类的作用域和类型属性是有益的。const
物体,在现实中const
C中的对象(相对于C+)不是真正的常量,因此在大多数实际情况下通常是无用的。
因此,在C中,选择应该由您计划如何使用常量来决定。例如,您不能使用const int
对象作为case
标签(而宏将工作)。你不能用const int
对象作为位字段宽度(而宏可以工作)。在C89/90中,您不能使用const
对象指定数组大小(而宏可以工作)。即使在C99中,您也不能使用const
对象来指定数组大小,当需要非-VLA阵列。
如果这对你很重要,那么它将决定你的选择。大多数时候,你别无选择,只能用#define
在C中,不要忘记另一种选择,它在C中产生真正的常数-enum
.
在C+中const
对象是真正的常量,所以在C+中,使用const
变式(不需要显式)static
在C+中)。
- 3 回答
- 0 关注
- 471 浏览
添加回答
举报