2016-08-17 47 views
0

我正在學習操作系統課程。 我們被教了管道,這個程序沒有在GCC 4.4.7中編譯。當我們將main更改爲int main時,它編譯得很好。是什麼原因?此管道程序不編譯

命令行:gcc pipedemo.c

#include<stdio.h> 
#include<sys/types.h> 
#include<string.h> 
#include<unistd.h> 
#include<stdlib.h> 

#define BUFFER_SIZE 100 
#define READ_END 0 
#define WRITE_END 1 

main() 
{ 
     char source[]="pipe_program"; 
     char dest[BUFFER_SIZE]; 
     char datas[BUFFER_SIZE]; 
     char datar[BUFFER_SIZE]; 
     int fd1[2],fd2[2]; 
     pid_t pid; 
     if(pipe(fd1)==-1) 
     { 
       fprintf(stderr,"Pipe creation failed\n"); 
       exit(0); 
     } 

     if(pipe(fd2)==-1) 
     { 
      //... 
     } 
     //... 
} 
+0

是否有任何理由讓你或你的朋友想使用非標準的函數定義語法? – MikeCAT

+0

原因可能是'-Werror'選項或其他東西。你介意公開命令行選項嗎? – MikeCAT

+0

@MikeCAT我沒有理由,但默認返回類型是int,所以我們寫了。但我想知道錯誤是什麼,對編譯沒有興趣 –

回答

2

標準(ISO/IEC 9899-2011)稱,main

5.1.2.2.1計劃啓動

叫在功能程序啓動被命名爲main。該實現的實現 未聲明 原型。它應爲int的返回類型和不帶 參數來定義:有兩個參數(這裏稱爲argc和argv,雖然任何名稱可能是使用

 int main(void) { /* ... */ } 

或 ,因爲他們是本地的功能):

 int main(int argc, char *argv[]) { /* ... */ } 

或同等產品;

這樣就結束了這一切嗎?
不,不那麼容易。在報價結尾處有一個小分號,接下來是這個小小的,看起來很無辜的部分

或其他一些實現定義的方式。

比有「託管」(OS和它的規則內部分5.1.2.2)和「自支撐」(在第5.1.2.1。例如在一個小PIC或相似,幾乎沒有任何規則之間的差在所有並且被定義其餘實現)

函數定義的語法在節6.9.1,其中它在項目中,讀被定義1

在函數定義聲明(這是名稱標識符)應該有一個函數類型,如函數定義的聲明部分所指定的那樣。

進一步詳述在第2項

的函數的返回類型應是無效的或比陣列型以外的完整的對象類型。

所以任何函數定義(包括main)都必須指定返回類型。

但請參閱上面「獨立環境」的規則或更好,缺少它們。

+0

有關完整的討論,請參見[main()'應該在C和C++中返回什麼?](http://stackoverflow.com/questions/204476/) –