C/C++ 中的常量
在 C 或 C++ 中定义常量有多少种不同的方法?
我已经知道使用 const
关键字和 #define
指令。我在某处听说还有两种定义常量的方法,但我从未见过其他方法。
还有其他人吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在 C 或 C++ 中定义常量有多少种不同的方法?
我已经知道使用 const
关键字和 #define
指令。我在某处听说还有两种定义常量的方法,但我从未见过其他方法。
还有其他人吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
enum
,如enum { some_constant= 2 };
编辑:我还忘记了在 C++ 中添加
constexpr
和用户定义的文字0x 标准。所以实际上还有三种额外的方法。enum
, as inenum { some_constant= 2 };
EDIT: I also forgot the additions of
constexpr
and user defined literals in the C++0x standard. So there are actually three additional ways.对于“常量”的基本非正式含义,您有
#define
、const
和enum
,正如已经提到的其他答案。但至少在我写这篇文章时,还没有人讨论过如何使用它们。
首先,我确信您知道宏是邪恶的,所以我不会再赘述这一点:只需对
#define
(作为定义常量的一种方法)说“不”即可。其次,当您需要在应该可移植到旧版编译器的代码中定义整数类型的常量静态成员时,枚举会派上用场。
第三,对于“定义”的正式意义来说,有一个可能非常令人惊讶的微妙之处:
部分微妙之处在于纯粹声明与定义的视觉形式的交换。在几乎任何其他上下文中,带有初始化的声明也是定义。但不适用于这个整型的静态成员!
微妙之处在于,如果没有定义,您就无法在某个地方正式获取 Blah::x 的地址;从形式上讲,正是定义赋予了它存储空间。
而且,微妙之处在于,除了历史意外之外,您只能对整型执行上述操作,而不能对例如 double 或字符串等执行上述操作。
要有效创建一个
double
类型的成员常量,您可以使用模板化常量惯用法作为解决方法。有效地完成编译器的工作,原则上它可以将上面的内容重写为。它是这样的:例如,您可能希望使用该技巧在头文件中完全定义类
Blah
。它的工作原理是由于对类模板的特殊支持——因为如果没有这种特殊规则,实际上不可能在头文件中使用
static
成员常量定义类模板。干杯&呵呵,,
For the basic informal meaning of "constant" you have
#define
,const
andenum
, as already mentioned by other answers.But at least as I'm writing this, nobody has yet discussed how to use them.
First, I'm sure you know that Macros Are Evil, so I shall not belabor the point: just say "no" to
#define
(as a means of defining constants).Second, the
enum
comes in handy when you need to define a constantstatic
member of integral type, in code that should be portable to older compilers.Third, for the formal meaning of "define" there is a perhaps very surprising subtlety:
Part of the subtlety is the exchange of the visual form of pure declaration versus definition. In just about any other context it's the declaration with initialization that is also the definition. But not for this static member of integral type!
And part of the subtlety is that without the definition, somewhere, you can't formally take the address of
Blah::x
; it's the definition that, formally, gives it storage.And, part of the subtlety is that for no good reason other than historical accident, you can only do the above for integral types, not for e.g.
double
, or a string, whatever.To effectively create a member constant of, say, type
double
, you can use the templated constant idiom as a workaround. Effectively doing the compiler's job, what it in principle could have rewritten the above as. It goes like this:For example, you might want to employ that trick for defining class
Blah
completely in a header file.It works due to special support for class templates -- because without that special rule, it would be practically impossible to define class templates with
static
member constants, in header files.Cheers & hth.,
在C中,有数字常量和字符串文字(例如
int i = 5
,5是一个常量)也许这就是他们的意思。In C, there are numeric constants and string literals (for example
int i = 5
, 5 is a constant) Maybe that's what they meant.