【问题标题】:25: warning: initializer element is not a constant expression [duplicate]25:警告:初始化元素不是常量表达式[重复]
【发布时间】:2013-12-08 01:52:56
【问题描述】:

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

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

【问题讨论】:

  • 不确定这是否可行,但请尝试const int ROWS = 1 << MESH_K;
  • 有效!并获得更优化解决方案的奖励。但是,如果您能提供帮助并将其设为编译时间常数,我将不胜感激。
  • 试试这个:#define POW_2_MESH_K 1 << MESH_K
  • @squeamishossifrage 如果您可以将此作为答案发布,我会接受!
  • 我刚刚检查了 GCC 生成的 asm 代码,它已经执行了所需的优化。所以我想,这一切现在都完成了。

标签: c gcc constants


【解决方案1】:

我相信你的答案是here

这将在 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 常量。

【讨论】:

  • 我在 SO 上遇到了尽可能多的问题。但是,我的问题更多是关于实现这一点的更好方法是什么,以便 ROWS 的值对于所有目的都是一个常数?
  • @darnir 那么constant 是什么意思呢?该值在编译时而不是运行时已知?
  • 是的。由于所涉及的所有值在编译时确实是已知的,我认为在编译时计算它是一个好主意。我意识到性能提升并非微不足道,但现在,我既想减少毫秒数,又想学习新东西。
  • @darnir 我认为这与您在 OP 中提出的问题不同。问题在于 constant 这个词的歧义,因为它的含义取决于您使用它的上下文。出于所有意图和目的,它是一个 compile-time constant。随意将其作为单独的问题发布,或要求 squeamish 发布答案以便您接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多