本以为C不会再给我带来惊喜了,但这却让我大吃一惊。
const int NUM_FOO = 5;
....
int foo[NUM_FOO];
==>error C2057: expected constant expression
我的 C++ 经验让我内心不赞成#define
越多越好。所以这真是一个惊喜。 VS2019,使用/TC编译。我认为 C99 无论如何都允许可变大小的数组。
任何人都可以解释为什么会发生拒绝,因为编译器在编译时肯定知道数组的大小?
C99不是允许可变大小数组吗?
在 C 语言中,这个声明:
const int NUM_FOO = 5;
不让NUM_FOO
一个常量表达式。
要记住的事情(是的,这有点违反直觉)是const
并不意味着constant. A 常量表达式粗略地说,可以在编译时评估(例如2+2
or 42
). The const
类型限定符,尽管它的名字显然源自英语单词“constant”,但实际上意味着“只读”。
例如,考虑一下这些是完全有效的声明:
const int r = rand();
const time_t now = time(NULL);
The const
只是意味着你不能修改的值r
or now
在它们被初始化之后。这些值显然要等到执行时才能确定。
(C++ 有不同的规则。它确实使NUM_FOO
常量表达式,以及该语言的更高版本添加的constexpr
为了这个目的。 C++ 不是 C。)
至于可变长度数组,是的,C 在 C99 中添加了它们(并在 C11 中使它们成为可选)。但作为詹姆斯德林的回答 https://stackoverflow.com/a/62354222/827263指出,VS2019不支持C99或C11。
(C++ 不支持 VLA。这:const int NUM_FOO = 5; int foo[NUM_FOO];
在 C99 和 C++ 中都是合法的,但原因不同。)
如果要定义类型的命名常量int
,你可以使用enum
:
enum { NUM_FOO = 5 };
或老式的宏(不限于键入int
):
#define NUM_FOO 5
詹姆斯德林的回答 https://stackoverflow.com/a/62354222/827263 and 德布什的回答 https://stackoverflow.com/a/62354229/827263都是正确的。我只是添加更多背景信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)