1

我在以正确的方式定义我在代码中使用的常量时遇到了一些麻烦。虽然我在How do I use extern to share variables between source files?,我好像误会了什么。这是设置:

/*   constants.h   */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;

此标头用于random.hmain.c,看起来像

#include "constants.h"
int NUM_PARTICLES=104;

random.h

#include "constants.h"
int LIGHTSPEED=104;

main.c,分别。NUM_PARTICLES在 main.c 中使用

30:  double ghosts[NUM_PARTICLES][4];
31:  double output[NUM_PARTICLES][3];

虽然这件事有效,但我收到以下警告,

main.c: In function ‘int main()’:
main.c:30:32: warning: ISO C++ forbids variable length array ‘ghosts’ [-Wvla]
main.c:31:32: warning: ISO C++ forbids variable length array ‘output’ [-Wvla]

这很奇怪,因为在我看来,我确实给数组一个在编译时已知的常量值。(通常这些数组长度错误会导致一些段错误,在这种情况下它们不会。)有什么想法吗?

4

1 回答 1

5

短篇小说:这是 C 的一个怪癖。

通常,您会将整数常量定义为

const int LIGHTSPEED = 104;

问题是根据语言规则,这个常量不是常量表达式,因此不能用于指定静态分配数组的大小。

C 标准的相关部分(6.6/6,我不是编造的)定义了整数常量表达式是什么:

整数常量表达式应具有整数类型,并且应仅具有整数常量、枚举常量、字符常量、结果为整数常量的 sizeof 表达式和作为强制转换的直接操作数的浮点常量的操作数。

有两种解决方案。经典的方法是使用宏,它只是104在编译器看到代码之前在尖括号之间粘贴,因此使数组大小成为整数常量:

#define NUM_PARTICLES 104

更好的一个(IMO)是避免使用宏,因为你可以使用一个enum,这是可能的(你正在使用一个枚举常量):

enum { NUM_PARTICLES = 104 };
于 2013-03-29T21:39:53.863 回答