gpt4 book ai didi

常量的正确定义

转载 作者:太空宇宙 更新时间:2023-11-04 01:09:36 27 4
gpt4 key购买 nike

我在以正确的方式定义我在代码中使用的常量时遇到了一些麻烦。尽管我在 How do I use extern to share variables between source files? 阅读了 Jonathan Leffler 的精彩帖子,我好像误会了什么。这是设置:

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

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

#include "constants.h"
int NUM_PARTICLES=104;

random.h

#include "constants.h"
int LIGHTSPEED=104;

分别在main.c中。 NUM_PARTICLES 用于 main.c 中

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]

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

最佳答案

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

通常,您会定义一个整型常量

const int LIGHTSPEED = 104;

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

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

An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts.

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

#define NUM_PARTICLES 104

更好的方法 (IMO) 是避免使用宏,因为您可以使用 enum,这是可能的(您正在使用枚举常量):

enum { NUM_PARTICLES = 104 };

关于常量的正确定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com