Woj*_*iec 1 c arrays global-variables
我在以正确的方式定义我在代码中使用的常量时遇到了一些麻烦.虽然我阅读了优秀的帖子Jonathan Leffler,但我如何使用extern在源文件之间共享变量?,我似乎误解了一些东西.这是设置:
/* constants.h */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;
Run Code Online (Sandbox Code Playgroud)
#include "constants.h"
int NUM_PARTICLES=104;
Run Code Online (Sandbox Code Playgroud)
在random.h或
#include "constants.h"
int LIGHTSPEED=104;
Run Code Online (Sandbox Code Playgroud)
在main.c,分别.NUM_PARTICLES用于main.c中
30: double ghosts[NUM_PARTICLES][4];
31: double output[NUM_PARTICLES][3];
Run Code Online (Sandbox Code Playgroud)
虽然这件事有效但我收到以下警告,
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]
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为在我看来,我确实给数组一个在编译时已知的常数值.(通常这些数组长度错误会导致一些段错误,在这种情况下它们不会.)任何想法?
短篇小说:这是C的怪癖.
通常,您可以将整数常量定义为
const int LIGHTSPEED = 104;
Run Code Online (Sandbox Code Playgroud)
问题是根据语言规则,此常量不是常量表达式,因此不能用于指定静态分配的数组的大小.
C标准的相关部分(6.6/6,我没有说明这一点)定义了一个整数常量表达式:
整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.
有两种解决方案.经典之一是使用一个宏,它只是104在编译器看到代码之前粘贴在尖括号之间,因此使数组大小为整数常量:
#define NUM_PARTICLES 104
Run Code Online (Sandbox Code Playgroud)
更好的一个(IMO)是避免宏,因为你可以,并使用enum,这是可能的(你使用枚举常量):
enum { NUM_PARTICLES = 104 };
Run Code Online (Sandbox Code Playgroud)