-3

我制作了一个简单的 C 程序,并尝试使用 gcc 编译器对其进行编译。但是当我执行gcc test.c -o test它时会抛出一些错误:

test.c:1:19: error: cstdlib: No such file or directory
test.c:2:20: error: iostream: No such file or directory
test.c: In function ‘main’:
test.c:8: error: ‘for’ loop initial declaration used outside C99 mode

而且我的 C 程序非常简单,所以我认为问题不在于代码:

#include <cstdlib>
#include <iostream>

int main(int args, char **argv){
    int result[500];

    for (int i = 0; i < sizeof(result); ++i){
        result[i] = 1;
    }

    return 0;
}

谢谢!

4

2 回答 2

7

.c 扩展名意味着 GCC 将源文件解释为 C 代码。您的标头包含的是 C++ 标头,因此 C 编译器会为您提供前两个错误。要解决此问题,您可以:

  • 将文件扩展名更改为,.cpp而不是.c,这将导致您的源代码被 GCC 解释为 C++ 代码。在 C++ 中,您所写的都是有效的。

或者:

  • 将第一个标头 include 更改为#include <stdlib.h>和 remove #include <iostream>,因为在 C 中没有与 iostream 完全等效的内容。尽管您的程序实际上并不需要这些标头中的任何一个,因为该程序非常简单。

至于 for 循环错误,问题在于您已经i在 for 循环的初始化步骤中声明了变量。这在 C99 之前是不允许的,因此您可以通过将声明i移至循环上方来解决此问题。

所以工作程序可能如下所示:

#include <stdlib.h>
#include <stdio.h>

int main(int args, char **argv){
    int result[500];
    int i;

    for (i = 0; i < sizeof(result)/sizeof(result[0]); ++i){
        result[i] = 1;
    }

    return 0;
}

在这种情况下,我将标题包含在程序中,即使它们不是必需的。stdio.h是在 C 中最接近iostream您的位置。

正如其他人所指出的,为了正确的行为,for 循环条件也应该更改为类似i < sizeof(result)/sizeof(result[0]).

这是因为 sizeof 与数组一起使用时,以字节为单位给出数组的大小,这取决于您的平台,这很可能意味着您在循环中得到错误的迭代次数。(一个 int 通常是四个字节,所以你写它的方式你的循环会迭代 2000 次而不是 500 次。通过除以数组的一个元素的大小,你每次都会得到正确的结果.)

更好的方法可能是#define在程序开始时使用幻数 500,并在需要时以这种方式引用它。

总的来说,主要问题是你真正拥有的是一个 C++ 程序,但你希望它是一个 C 程序。您必须决定您真正想要使用哪种语言。

于 2013-08-20T10:53:55.100 回答
1

cstdlib 和 iostream 是 C++ 头文件。对于 cstdlib,您可以改用 stdlib.h。但是,您可能不会使用 iostream,因为 iostream 是纯 C++ I/O 库。我想你想要的可能是“stdio.h”

更重要的是,如果你想使用像在“for”循环的初始部分声明变量“i”这样的特性,你可以在C99模式下编译你的程序,因为C99之前的C语言标准不支持这个种用法。

要在 C99 模式下编译 ac 源代码,例如“ac”,只需在 gcc 命令中添加 -std=c99 参数即可。例如:“gcc -std=c99 ac”

于 2013-08-20T11:01:51.373 回答