我在用正确的方式定义代码中使用的常量时遇到了一些问题虽然我在How do I use extern to share variables between source files?上读到了Jonathan Leffler的文章,但我似乎误解了一些东西。这是设置:
/* constants.h */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;
此头文件用于random.h和main.c中,看起来像
#include "constants.h"
int NUM_PARTICLES=104;
在
random.h
或#include "constants.h"
int LIGHTSPEED=104;
分别在
main.c
中。NUM_PARTICLES
用于main.c in30: 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]
这很奇怪,因为在我看来,我确实给了数组一个在编译时已知的常量值。(通常这些阵列长度错误会导致一些分段错误,在这种情况下不会)有什么想法吗?
最佳答案
短篇小说:这是C的怪癖。
通常,您将整数常量定义为
const int LIGHTSPEED = 104;
问题是,根据语言规则,此常量不是常量表达式,因此不能用于指定静态分配数组的大小。
C标准的相关部分(6.6/6,我不编这个)定义了整型常量表达式是什么:
整数常量表达式应具有整数类型,并且应
只有整数常量、枚举常量和,
字符常量,结果为整数的sizeof表达式
常量和浮动常量,它们是
演员。
有两种解决方案。经典的方法是使用宏,在编译器看到代码之前,只需在尖括号之间粘贴
104
,从而使数组大小成为整数常量:#define NUM_PARTICLES 104
更好的方法(IMO)是避免使用宏,因为您可以使用
enum
,这是可能的(您使用的是枚举常量):enum { NUM_PARTICLES = 104 };
关于c - 正确定义常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15711785/