GCC在尝试编译时给出了以下警告消息:
las.c:13:18: warning: initializer element is not a constant expression [enabled by default]
const int ROWS = pow (2, MESH_K);
相关的代码部分是:
#define MESH_K 10
#define BUFF_SIZE 30
const int ROWS = pow (2, MESH_K);
我需要在代码的后续点使用MESH_K和ROWS。我知道函数调用可能导致GCC认为这不是一个常量表达式。然而,鉴于对pow的这种调用本质上是一个常数,是否有更好的方法来实现它(可能是预处理器宏?)并消除警告?
我不介意在这部分代码中牺牲性能的可读性,因此欢迎任何和所有复杂的解决方案。
答案 0 :(得分:4)
我相信你的答案是here。
这将在C ++中正常编译,但不能在C中编译。
像pqueamish说的那样,它与C语言有关。在C语言对象中使用静态 存储持续时间必须用常量表达式初始化或 包含常量表达式的聚合初始值设定项。
“大”对象永远不会是C中的常量表达式,即使是 object被声明为const。
此外,在C语言中,术语“常数”是指字面意思 常量(如1,'a',0xFF等)和枚举成员。 Const限定对象(任何类型)都不是C语言中的常量 术语。它们不能用于对象的初始化器中 静态存储持续时间,无论其类型如何。
const int ROWS = 1 << MESH_K;
会起作用,但是:
int test = 10;
const int ROWS = 1 << test;
不行。我的猜测是MESH_K
作为文字粘贴到代码中,因此解析为C常量。