试图编译一个C程序

时间:2013-08-20 10:49:55

标签: c gcc for-loop compiler-construction main

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

谢谢!

2 个答案:

答案 0 :(得分:7)

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

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

或者:

  • 将第一个标题包括更改为#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;
}

在这种情况下,我将标题包含在程序中,即使它们不是必需的。 stdio.h最接近你可以获得的iostream

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

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

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

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

答案 1 :(得分:1)

cstdlib和iostream是C ++头文件。 对于cstdlib,您可以使用stdlib.h代替。但是,您可能不使用iostream,因为iostream是纯C ++ I / O库。我猜你想要的可能是&#34; stdio.h&#34;

还有什么,如果你想使用这个功能,比如声明变量&#34; i&#34;在&#34; for&#34;的最初部分循环,您可以在C99模式下编译您的程序,因为C99之前的C语言标准不支持这种用法。

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