【问题标题】:Trying to compile a C program试图编译一个 C 程序
【发布时间】:2013-08-22 09:24:33
【问题描述】:

我制作了一个简单的 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++头文件使用g++。对于您的此代码,您不需要任何头文件。
  • 你要么在 C++ 中编码(然后需要使用 g++ 而不是 gcc),要么在 C 中(然后摆脱 C++ 包含)。
  • 为了澄清上述内容,将包含更改为“stdlib.h”和“stdio.h”
  • 另一件事:sizeof 给出了字符的大小,而不是数组中的位置数,所以你需要写 i .
  • 如果使用 gcc 编译,请添加 -std=c99。在 for 循环头中定义变量是 C99 中的新功能。

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


【解决方案1】:

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

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

或者:

  • 将第一个头文件包含更改为#include &lt;stdlib.h&gt; 并删除#include &lt;iostream&gt;,因为在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 是你在 C 中最接近 iostream 的地方。

正如其他人所指出的,为了获得正确的行为,for 循环条件也应该更改为 i &lt; sizeof(result)/sizeof(result[0]) 之类的东西。

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

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

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

【讨论】:

  • 最后一个与for循环相关的错误是什么?你知道那个错误吗?
  • 最后一个错误也是因为您在 C 程序中使用 C++ 语法。如果切换到 C,则必须在循环外声明循环变量。对于 C++ 来说没问题。
  • 还建议更正sizeof(result) / sizeof(result[0])作为循环条件:阅读this answer
  • @Devolus:自 1999 年标准以来,在循环内定义循环变量就在 C 中工作,因此您无需为此切换到 C++。好吧,除非你使用的是 Visual Studio,它仍然停留在 1989 年。
  • 谢谢,我已做出建议的更改(或目前正在编辑它们)
【解决方案2】:

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”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 2022-07-09
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多