C中的const修饰符

时间:2011-03-31 09:09:08

标签: c

由于无法使用以下初始化模式创建数组而回到C时,我常常感到困惑......

const int SOME_ARRAY_SIZE = 6;
const int myArray[SOME_ARRAY_SIZE];

我对这个问题的理解是const运算符不保证常量,而只是断言SOME_ARRAY_SIZE指向的值在运行时不会改变。但是为什么编译器不能假设值在编译时是常量的?它在源代码中就说了6 ...

我认为我对C的基本理解缺少一些核心内容。有人在这里帮助我。 :)

[更新]在C99和可变长度数组周围阅读了一下后,我想我更了解这一点。我试图创建的是一个可变长度数组 - const不会创建编译时常量,而是创建运行时常量。因此,我正在初始化一个可变长度数组,该数组仅在C99的函数/块范围内有效。文件范围内的可变长度数组是不可能的,因为编译器无法将固定内存地址分配给无界数组。[/ UPDATE]

5 个答案:

答案 0 :(得分:6)

嗯,在C ++中,语义有点不同。在C ++中,您的代码可以正常工作。您必须区分两件事constconstant expression。如您所述,Const意味着该值是只读的。另一方面,常量表达式意味着该值是已知的编译时间,并且是编译时常量。 C中const的语义始终是第一种类型。 C中唯一的常量表达式是文字,这就是#define用于此类事情的原因。

但是,在C ++中,使用常量表达式初始化的任何const对象本身都是一个常量表达式。

我不知道为什么在C中它是这样的,它就是它的方式

答案 1 :(得分:4)

问题是语言语法需要[]之间的整数值。 SOME_ARRAY_SIZE仍然是一个变量(即使你告诉编译器没有人允许改变它!)

答案 2 :(得分:2)

const关键字基本上是只读指示。它实际上并不表示潜在的价值不会改变,即使你的例子就是这种情况。

当谈到指针时,这更清楚:

void foo(int const * p)
{
  if (*p == 100)
  {
    bar();
    /* Here, the compiler can not assume that *p is 100 */
  }
}

在这种情况下,编译器不应该接受示例中的代码,因为它需要数组大小不变。如果它接受它,用户以后可能会在将代码移植到更严格的编译器时遇到麻烦。

答案 3 :(得分:1)

您可以在C99中执行此操作,并且C99之前的某些编译器也支持此作为C89的扩展(例如gcc)。如果您仍然坚持使用没有C99支持的旧编译器(例如MSVC),那么您将必须使用旧skool 方式并使用#define进行操作数组大小。

请注意,上述注释仅适用于本地范围内的此类声明(即自动变量)。 C99仍然不允许在全球范围内进行此类声明。

答案 4 :(得分:0)

我刚用我的Xcode和Objective C文件做了一个非常快速的测试我目前在我的机器上打开并将其放在.m文件中:

const int arrs = 6;
const int arr[arrs];

这个编译没有任何问题。