繁体   English   中英

写()上的Gcc和g ++不同

[英]Gcc and g++ different on write()

#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);
                      ^

这是为什么?

这是因为gcc是C编译器,g ++是C ++编译器, C和C ++是不同的语言

如果要将源代码编译为C ++程序,则必须将其更改为C ++。 例如,C ++中没有隐式函数声明,因此必须为read()write()声明包含unistd.h 您也不需要syscall.h头文件。

而且,它只是那么简单,因为你有一个简单的代码片段。 将C代码移植到C ++可能是一场噩梦,因为有大约50个差异,在某些情况下代码编译得很好,但行为不同。

PS:而不是自己定义奇怪的BUFSIZE,考虑使用标准BUFSIZ :)

C默认函数没有原型到返回int的函数 - 但你应该得到警告(你使用-Wall ?)。

C ++不允许这样做,你需要包含正确的头文件unistd.h ,你也应该在C中做。

你只需要添加include <unistd.h>

我升级到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM