正确定义常量

时间:2013-03-29 21:36:50

标签: c arrays global-variables

我在以正确的方式定义我在代码中使用的常量时遇到了一些麻烦。虽然我在How do I use extern to share variables between source files?阅读了优秀的帖子Jonathan Leffler,但我似乎误解了一些东西。这是设置:

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

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

#include "constants.h"
int NUM_PARTICLES=104;
<{1>}或

中的

random.h

分别在#include "constants.h" int LIGHTSPEED=104; 中。 <{1}}在main.c中使用

main.c

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

NUM_PARTICLES

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

1 个答案:

答案 0 :(得分:5)

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

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

const int LIGHTSPEED = 104;

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

C标准的相关部分(6.6 / 6,我没有说明这一点)定义整数常量表达式是什么:

  

整数常量表达式应具有整数类型且必须   只有整数常量的操作数,枚举常量,   字符常量,sizeof表达式,其结果是整数   常量和浮动常量,它们是直接操作数   管型。

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

#define NUM_PARTICLES 104

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

enum { NUM_PARTICLES = 104 };