2

私はこのコードを取得します:

#include<stdio.h> 
#include<stdlib.h>

void main(void) 
{ 
    char *ptr = (char*)malloc(10); 

    if(NULL == ptr) 
    { 
        printf("\n Malloc failed \n"); 
        return; 
    } 
    else 
    { 
        // Do some processing 
        free(ptr); 
    } 

    return; 
} 

Visual C では正常にコンパイルされますが、gcc ではコンパイルされません。「エラー: 'main' は 'int' を返す必要があります」というメッセージが表示されます。main() 関数の戻り値の型 'int' は規則 (コンパイラが定義するもの) ですか、それとも C の規則ですか?

4

3 に答える 3

11

C 標準 (ISO/IEC 9899:2011) には次のように記載されています。

5.1.2.2.1 プログラムの起動

1 プログラムの起動時に呼び出される関数の名前はmain. 実装は、この関数のプロトタイプを宣言していません。戻り値の型をintパラメータなしで定義する必要があります。

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

または 2 つのパラメーター (ここではargcandと呼ばれますargvが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):

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

または同等のもの; 10)または他の実装定義の方法で。

10) したがって、intとして定義された typedef 名に置き換えることができます。またint、argv の型を として記述することもできます char **argv

したがって、唯一のポータブル宣言main()の戻り値の型はintです。MSVC がそれvoidが許可されていると定義している場合 (「または他の実装定義の方法で」) は、それで問題ありませんが、コードが移植可能であるとは期待しないでください。Microsoft コンパイラの古いバージョン (MSVC 2005 まで) は許可しませんvoid main(): 次のドキュメントを参照してくださいmain: Program startupおよびThe mainFunction and Program Execution . ただし、MSVC 2008 以降では許可するように文書化されていますvoid main(): 参照main: プログラムの起動。の 3 引数形式はmain()、付録 J に共通の拡張として記載されています。

J.5 共通拡張

次の拡張機能は多くのシステムで広く使用されていますが、すべての実装に移植できるわけではありません。厳密に適合するプログラムを無効にする可能性のある拡張機能を含めると、実装が適合しなくなります。このような拡張機能の例としては、新しいキーワード、標準ヘッダーで宣言された追加のライブラリ関数、アンダースコアで始まらない名前を持つ定義済みマクロがあります。

J.5.1 環境引数

ホストされた環境では、main関数は 3 番目の引数 を受け取ります。この引数はchar *envp[]、 へのポインタの null で終わる配列を指しますchar。各引数は、プログラムのこの実行の環境に関する情報を提供する文字列を指します (5.1.2.2.1 )。


から返された値はmain()、実装定義の方法で「環境」に送信されます。

5.1.2.2.3 プログラムの終了

1 関数の戻り値の型が とmain互換性のある型である場合、関数intへの最初の呼び出しからの戻りは、関数によって返された値を引数として関数mainを呼び出すことと同じです。11)関数を終了する に到達すると、値 0 が返されます。戻り値の型が と互換性がない場合、ホスト環境に返される終了ステータスは規定されていません。exitmain}mainint

11) 6.2.4 に従って、自動保存期間が宣言されているオブジェクトの存続期間はmain 、前者の場合は終了しますが、後者の場合は終了しません。

0「成功」として義務付けられていることに注意してください。EXIT_FAILURE必要に応じてand EXIT_SUCCESSfromを使用できます<stdlib.h>が、0 は十分に確立されており、1 も同様です。255 より大きい終了コードも参照してください — 可能ですか? .

7.22.4.4exit関数

¶5 最後に、制御がホスト環境に戻されます。の値statusが 0 またはの場合、正常終了EXIT_SUCCESSステータスの実装定義形式が返されます。の値が である場合、ステータスの失敗した終了の実装定義形式が返されます。それ以外の場合、返されるステータスは実装定義です。statusEXIT_FAILURE

于 2013-07-18T05:17:40.437 に答える
0

c標準によると、main()成功または失敗を通知するために整数を返す必要があります。通常、成功の場合はゼロを返し、失敗の場合は整数値(正または負)を返します。通常、main は次のように宣言されます。

 int main(void); 

したがって、戻り値の型として整数が期待されます。

コマンドライン引数がある場合、

int main(int argc,char *argv[]);
于 2013-07-18T05:17:04.373 に答える
0

void main()は非標準 C でint main()あり、標準です。

于 2013-07-18T05:16:41.920 に答える