簡體   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