我在以正确的方式定义我在代码中使用的常量时遇到了一些麻烦。虽然我在How do I use extern to share variables between source files?阅读了优秀的帖子Jonathan Leffler,但我似乎误解了一些东西。这是设置:
/* constants.h */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;
#include "constants.h"
int NUM_PARTICLES=104;
<{1>}或中的
random.h
分别在#include "constants.h"
int LIGHTSPEED=104;
中。 <{1}}在main.c中使用
main.c
虽然这件事有效但我收到以下警告,
NUM_PARTICLES
这很奇怪,因为在我看来,我做给数组一个在编译时已知的常量值。 (通常这些数组长度错误会导致一些段错误,在这种情况下它们不会。)任何想法?
答案 0 :(得分:5)
短篇小说:这是C的怪癖。
通常,您将整数常量定义为
const int LIGHTSPEED = 104;
问题在于,根据语言规则,此常量不是常量表达式,因此不能用于指定静态分配的数组的大小。
C标准的相关部分(6.6 / 6,我没有说明这一点)定义整数常量表达式是什么:
整数常量表达式应具有整数类型且必须 只有整数常量的操作数,枚举常量, 字符常量,sizeof表达式,其结果是整数 常量和浮动常量,它们是直接操作数 管型。
有两种解决方案。经典的是使用一个宏,它只是在编译器看到代码之前在尖括号之间粘贴104
,因此使数组大小为整数常量:
#define NUM_PARTICLES 104
更好的一个(IMO)是避免宏,因为你可以,并使用enum
,这是可能的(你使用枚举常量):
enum { NUM_PARTICLES = 104 };