Gcc和g++在write()函数上有何不同

5
#include <sys/syscall.h>
#define BUFSIZE 1024

main()
{
     char buf[BUFSIZE];
     int n;
     while((n=read(0,buf,BUFSIZE))>0)
         write(1,buf,n);
     return 0;
}

当我使用gcc编译时,一切正常。但是当我使用g++编译时,出现了以下错误:
inandout.c:7:32: error: ‘read’ was not declared in this scope
     while((n=read(0,buf,BUFSIZE))>0)
                                ^
inandout.c:8:22: error: ‘write’ was not declared in this scope
         write(1,buf,n);
                      ^

为什么会这样?

1
读和写的函数在 unistd.h 中,你在 C 语言中很幸运或者有一些我不知道的技巧。 - Guido
7
请尝试使用 #include <unistd.h> - smac89
3
因为C和C++是不同的编程语言...这些并不是g++应该抱怨的唯一事情(提示:总是使用“-pedantic”进行编译)。 - Konrad Rudolph
@KonradRudolph:以及“-Wall”、“-Wextra”、“-Wshadow”和一些其他选项 :) - user405725
4个回答

12
这是因为gcc是C编译器,g ++是C ++编译器,而C和C ++是不同的语言
如果您想将源代码编译为C ++程序,则必须将其更改为C ++。例如,在C ++中没有隐式函数声明,因此必须包括unistd.h以进行read()write()声明。您也不需要syscall.h头文件。
此外,这只是因为您有一个简单的代码片段,所以才如此简单。将C代码移植到C ++可能会成为噩梦,因为存在约50个差异,并且在某些情况下,代码在两种情况下都可以编译,但行为不同。
附言:与其自己定义奇怪的BUFSIZE,不如考虑使用标准BUFSIZ :)

2

您只需要添加include <unistd.h>即可。


1
C默认将没有原型的函数转换为返回int类型的函数,但是你应该会收到警告(你使用了-Wall吗?)。
C++不允许这样做,你需要包含正确的头文件unistd.h,在C中也是如此。

1
也可以加上-Wextra - Dennis Meng

0

我升级到了gcc 4.8.5版本。在4.7版本中,编译器停止在许多包含文件中包含unistd.h。这就是为什么旧的gcc编译器版本可以在不包含unistd.h的情况下工作。

https://gcc.gnu.org/gcc-4.7/porting_to.html "C++语言问题 头文件依赖性变化 许多标准C++库包含文件已被编辑,不再包含unistd.h以消除命名空间污染。"

在我的情况下,当我包含stdio.h时,我得到了“::write未声明”的错误,但我的先前的gcc版本4.4编译正常。这是一个有用的命令,可以查看预处理器正在搜索哪些路径:g++ -H test.cpp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接