C 常数的正确定义

C 常数的正确定义,c,arrays,global-variables,C,Arrays,Global Variables,我在以正确的方式定义代码中使用的常量时遇到了一些问题。虽然我读了乔纳森·莱夫勒在的优秀文章,但我似乎误解了一些东西。以下是设置: /* constants.h */ extern int NUM_PARTICLES; extern int LIGHTSPEED; 此标题在和中使用,如下所示 #include "constants.h" int NUM_PARTICLES=104; 以随机方式。h或 分别在main.c中。中的main.c中使用了NUM_粒子 30: double g

我在以正确的方式定义代码中使用的常量时遇到了一些问题。虽然我读了乔纳森·莱夫勒在的优秀文章,但我似乎误解了一些东西。以下是设置:

/*   constants.h   */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;
此标题在和中使用,如下所示

#include "constants.h"
int NUM_PARTICLES=104;
以随机方式。h或

分别在main.c中。中的main.c中使用了NUM_粒子

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]

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

短篇小说:这是C

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

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

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

整数常量表达式应具有整数类型,且应 仅具有整数常量、枚举常量、, 字符常量,sizeof表达式,其结果为整数 常量和作为的直接操作数的浮点常量 演员

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

#define NUM_PARTICLES 104
enum { NUM_PARTICLES = 104 };
更好的方法是避免使用宏,因为您可以使用枚举,也可以使用枚举常量:

#define NUM_PARTICLES 104
enum { NUM_PARTICLES = 104 };

短篇故事:这是C

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

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

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

整数常量表达式应具有整数类型,且应 仅具有整数常量、枚举常量、, 字符常量,sizeof表达式,其结果为整数 常量和作为的直接操作数的浮点常量 演员

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

#define NUM_PARTICLES 104
enum { NUM_PARTICLES = 104 };
更好的方法是避免使用宏,因为您可以使用枚举,也可以使用枚举常量:

#define NUM_PARTICLES 104
enum { NUM_PARTICLES = 104 };

除了你的问题,你还有一个问题,你编译C代码作为C++,这不是一个好主意。特别是,处理两个条件下的变量是不同的。是的,我有一种鬼鬼祟祟的感觉,把C和C++混合会造成一些问题,但是很不幸我不能改变它。除了你的问题,你还有一个问题,你编译C代码作为C++,这不是一个好主意。特别是,处理两个条件下的变量是不同的。是的,我有一种鬼鬼祟祟的感觉,把C和C++混合会造成一些问题,但是很不幸我不能改变它。D