【问题标题】:Why doesn't this C program compile? What is wrong with this?为什么这个 C 程序不能编译?这有什么问题?
【发布时间】:2010-07-02 16:08:41
【问题描述】:

为什么这个 C 程序不能编译?这有什么问题?

我已经在 wxDevC++ 和 Turbo C++ 3.0 上尝试过。

Main.c

#include<stdio.h>
#include<conio.h>

const int SIZE = 5;

int main(int argc, char ** argv)
{    
    char array[SIZE] = {'A', 'B', 'C', 'D', 'E'};

    printf("Array elements are,\n");
    int i=0;

    for(i=0 ; i<SIZE ; ++i)
    {
        printf("%c  ", array[i]);
    }

    getch();

    return 0;
}

两个编译器的错误信息相似。

f:\_Source-Codes\main.c In function `main':

8 f:\_Source-Codes\main.c variable-sized object may not be initialized

【问题讨论】:

  • 什么是错误?
  • 我没有立即看到任何问题...您看到了什么错误?
  • 您的编译器不允许使用可变大小的数组。只需将 array[SIZE] 替换为 array[5] /or/ replace const int SIZE = 5;使用#define SIZE 5,它将编译(至少对于那个错误)。
  • "pile of pooh" = 一大堆不太聪明的熊——这不是你在开发工具中想要的东西
  • Turbo C++ 3.0,1992 年左右我用过的第一个 C++ 编译器。这个问题一定是个笑话!

标签: c


【解决方案1】:

C89/90 语言中的数组大小必须由整数常量表达式 指定(C99 也是如此)。 C 中的const int 对象不是常量表达式,这就是为什么不能使用它来指定数组大小的原因。注意:这是 C 和 C++ 之间的一个显着区别。

在 C 语言中,术语 constant 指的是 literal 常量,即510.20xFF'a' 等等(枚举常量准确地说,也是常量)。 const int 对象再次不是 C 中的 常量,不能用于构建常量表达式。

如果您想预先声明一个命名常量以用作 C 中的数组大小,您必须使用#defineenum。这同样适用于大小写标签、位域大小和需要常量表达式的所有其他上下文。

更多详情请见this

【讨论】:

  • 这在 C++ 中是否允许?如果我做了const int SIZE = someFunction();,编译器在编译时不会知道char array[SIZE] 需要多少堆栈空间...
  • @BlueRaja:在 C++ 中,常量表达式可以使用const 对象用常量表达式初始化。在您的情况下,您的 const 对象未使用常量表达式初始化,这就是它本身不是常量的原因。
  • @AndreyT,那么 C 中的 const-keyword 有什么用?
  • @Andrey:关于什么构成常量表达式的任何链接?如果 someFunction() 被定义为 const int someFunction() { return 5; } 会怎样?那么 SIZE 是否会被视为使用常量表达式进行初始化?
  • @JMSA:const 只表示以后不能更改变量的值——初始值本身可能不是常量表达式。 @BlueRaja:我想这取决于编译器是否决定扩展 someFunction 内联。
【解决方案2】:

如果编译器将其视为“.c”文件,则int i 声明需要在任何可执行行之前,特别是在printf 之前。

编辑,现在您显示了错误消息:

编译 main 时,编译器不会将 SIZE 视为常量。您可以使用#define SIZE 5 作为解决方法。

根据 K&R 第 2 版。 :

"const 的目的是宣布可能以只读方式放置的对象 记忆。 ...除了它应该诊断 显式尝试更改 const 对象,编译器可能会忽略 [the const] 限定符”。

因此,声明 const int SIZE = 5 不会使 SIZE 成为 常量表达式,而这是数组大小说明符所要求的。

【讨论】:

  • 是的。但是为什么 const 不起作用? ANSI 标准是怎么说的?
  • 正确,声明必须继续该方法。
  • 可能是因为 Turbo C++ 3.0 已经快 20 年了
  • @fuzzy lollipop,好的,但我也在 wxDevC++ 和 VS2008 上测试过。
  • @AShelly:严格来说,你从 K&R 获得的相当无关紧要。 C 语言中的const 对象从不 常量。 C 中的术语constant 具有完全不同的含义。 C 术语中的 Constant 就是我们在 C++ 中所说的 literal(如 50x1'a')。 const int 对象不是 C 中的常量,不能用于需要 常量表达式 的地方。无论编译器是否忽略“某事”,这始终是正确的。
【解决方案3】:

尝试替换

const int SIZE = 5;

#define SIZE 5

大多数 C 编译器不允许声明大小包含在变量中的静态数组(即数组大小在运行时确定)。

【讨论】:

  • 最多?哪些编译器允许声明 static 数组“其大小包含在变量中”?
  • @AndreyT:只是为了安全而不是抱歉。
【解决方案4】:

试试这个:

char array[] = {'A', 'B', 'C', 'D', 'E'};

【讨论】:

  • @overslacked,这不是真的。大小首先取决于指定的常数。 char array[2] = {'a','b','c'}; 生成错误。 char array[3] = {'a','b'}; 生成一个 3 元素数组。如果[]s 为空,则仅从初始化列表中推断出大小。
猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多