【问题标题】:Why do I get an error about the initializer not being a constant?为什么我会收到关于初始化程序不是常量的错误?
【发布时间】:2012-07-17 11:19:17
【问题描述】:

我正在使用以下代码。

const int X_ORIGIN = 1233086;             
const int Y_ORIGIN = -4728071;              
const int Z_ORIGIN = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

当我编译它时,GCC 给了我以下错误。

Transformations.h:16:1: 错误:初始化元素不是常量

这是什么意思?如何修复我的代码?

【问题讨论】:

标签: c constants initializer


【解决方案1】:

人们经常被关键字const 的命名所误导,暗示着某种无法改变的常数值。至少在 C 中,它意味着 只读。 const 文件范围内的合格对象没有适当的常量来充当数组初始值设定项。

作为非常量常量的一个例子,声明是完全可以的

 const volatile unsigned int milliseconds_since_boot;

是一个从编译器控制之外更新的值(想想硬件寄存器),你不能分配给它,即它是只读的。

【讨论】:

  • 为什么投反对票?如果有问题,请给我补救的机会。
  • 不是我的 DV,但您可以详细说明 OP 的实际问题。对于甚至可能不知道“硬件寄存器”是什么的初学者来说,这个例子很难理解。
【解决方案2】:

您不能在 C 的全局范围内执行此操作,只能在本地范围内执行此操作,即在函数内:

#define NUM_DIMENSIONS 3

const int X_ORIGIN = 1233086;             
const int Y_ORIGIN = -4728071;              
const int Z_ORIGIN = 4085704;

const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; // FAIL

void foo(void)
{
    const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; // OK
}

或者,您可以将代码编译为 C++ 而不是 C。

【讨论】:

  • 定义而不是 const int 很重要。该死的大小显然不能是任何类型的变量(甚至是常量)。
  • 仅用于自动存储类,这意味着在函数内而不是静态(或 C11 _Thread_local)。
【解决方案3】:

我不是一个合格的程序员;)但我会这样做:

#define X_ORIGIN (1233086)
#define Y_ORIGIN (-4728071)
#define Z_ORIGIN (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

那样它只是一个文本替换。如果编译器仍然吐出假人,至少你离知道问题出在哪里更近了一步。

【讨论】:

  • @nathanwhite 需要详细说明吗?宏很好地解决了这个问题! (假设 NUM_DIMENSIONS 在某处定义)。
  • @nathanwhite 这些正是“初始化元素不是常量”错误的原因。将NUM_DIMENSIONS 作为变量(或非 const 限定)会导致“在文件范围内可变地修改 »xyzOrigin«。
  • 最好还是完全删除NUM_DIMENSIONS 并让数组自己调整为提供的元素数量。
【解决方案4】:

作为替代方案,这也适用于这种情况:

enum { X_ORIGIN = 1233086,
       Y_ORIGIN = -4728071,
       Z_ORIGIN = 4085704 };

const int xyzOrigin[] = { X_ORIGIN, Y_ORIGIN, Z_ORIGIN };

int main()
{
    return 0;
}

【讨论】:

    【解决方案5】:

    在 C 语言中,具有静态存储持续时间的对象必须使用常量表达式或包含常量表达式的聚合初始值设定项进行初始化。 --Answer of AndreyT

    看完你一定知道NUM_DIMENSIONS,如果有const-qualification,不是常数!那你就不能用这种方式初始化你的数组了。

    使用此代码:

    const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

    您应该使用:#define NUM_DIMENSIONS 3 或者您可以在方括号 const int xyzOrigin[] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; 内不带任何变量声明

    【讨论】:

      【解决方案6】:

      正如三氯生所说:

      main()
      {
          const int X_ORIGIN = 1233086;
          const int Y_ORIGIN = -4728071;
          const int Z_ORIGIN = 4085704;
          const int xyzOrigin[] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
      }
      

      这很好用……

      或者,如果您事先知道尺寸,则:

      #define DIM 3
      
      main()
      {
          const int X_ORIGIN = 1233086;
          const int Y_ORIGIN = -4728071;
          const int Z_ORIGIN = 4085704;
          const int xyzOrigin[DIM] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多