2016-08-17 4 views
0

OSコースを習っています。 私たちはパイプを教えていましたが、このプログラムはGCC 4.4.7でコンパイルされていません。 mainint 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なので、書きました。しかし、私はエラーが何であるかを知りたいです。コンパイルではintrestされません。 –

答えて

2

標準(ISO/IEC 9899から2011)は約main言う:

5.1.2.2.1プログラムの起動

で呼び出される関数プログラムの起動はmainと呼ばれます。実装 は、この関数のプロトタイプを と宣言しません。任意の名前が を使用してもよい彼らはに対してローカルであるとして、

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

または二つのパラメータ(argcとargvのようここでいう、と:それはint型の戻り値の型をなし パラメータで定義されなければなりませんそれらが宣言された機能):

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

または同等のもの;

これですべて終了しますか?
いいえ、そう簡単ではありません。見積もりの​​最後に小さなセミコロンがあり、それに続くのは、この小さな、一見無実の部分です。

または他の実装定義の方法でです。セクション5.1.2.1で(OSおよびそのルール内のセクション5.1.2.2)と「自立」を(「ホステッド」。例えば、小さなPICまたは同様、ほとんどの任意のルールに差があるよりも

)すべてで、残りは実装が定義されている関数定義の構文は、それがアイテムを読み込むセクション6.9.1で定義されている1

名である(関数定義で宣言された識別子)は、関数定義の宣言子部分で指定された関数型を持たなければならない。

項目2

に関数の戻り型がvoidまたは配列型以外の完全なオブジェクト・タイプでなければならないさらなる詳細。 (main含む)

だから、任意の関数定義は、指定された戻り値の型を持っている必要があります。

しかし、上記の「自立した環境」のルール、またはそれらの欠如を参照してください。

+0

詳細については、「CとC++でmain()を返すべきもの」(http://stackoverflow.com/questions/204476/)を参照してください。 –

関連する問題