正在尝试编译C程序



我制作了一个简单的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;
}

谢谢!

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

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

或者:

  • 将第一个头include更改为#include <stdlib.h>并删除#include <iostream>,因为在C中没有确切的iostream等价物。不过,您的程序实际上并不需要这两个头,因为程序非常简单

至于for循环错误,问题是您在for循环的初始化步骤中声明了变量i。这在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;
}

在这种情况下,我在程序中留下了头includes,尽管它们不是必需的。stdio.h是你在C.中能得到的最接近iostream

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

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

一个更好的方法可能是在程序开始时使用#define(魔术数字500),并在需要时以这种方式引用它。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新