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

时间:2013-11-23 01:40:58

标签: c gcc const

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

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

1 个答案:

答案 0 :(得分:4)

我相信你的答案是here

这将在C ++中正常编译,但不能在C中编译。

  

它与C语言有关。在C语言对象中使用静态   存储持续时间必须用常量表达式初始化或   包含常量表达式的聚合初始值设定项。

     

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

     

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

像pqueamish说的那样,const int ROWS = 1 << MESH_K;会起作用,但是:

int test = 10;

const int ROWS = 1 << test;

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