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