25:警告:初始化元素不是常量表达式

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的调用本质上是一个常量,是否有更好的方法来实现它(可能是预处理器宏?)并消除警告?

我不介意在这部分代码中牺牲性能的可读性,因此欢迎任何和所有复杂的解决方案。

我相信你的答案就在这里 。

这将在C ++中编译良好,但在C中不能编译。

它与C语言有关。 在C语言中,具有静态存储持续时间的对象必须使用常量表达式或包含常量表达式的聚合初始化程序进行初始化。

“大”对象永远不会是C中的常量表达式,即使该对象声明为const也是如此。

此外,在C语言中,术语“常量”是指文字常量(如1,’a’,0xFF等)和枚举成员。 Const限定对象(任何类型)不是C语言术语中的常量。 它们不能用于具有静态存储持续时间的对象的初始化程序,无论其类型如何。

像squeamish说的那样, const int ROWS = 1 << MESH_K; 会工作,但是:

 int test = 10; const int ROWS = 1 << test; 

不管用。 我的猜测是MESH_K作为文字粘贴到代码中,因此解析为C常量。