[英]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.