役に立ちましたか?

解決

main の戻り値は、プログラムの終了方法を示す必要があります。通常の終了は、通常、 main からの戻り値0で表されます。異常終了は通常、ゼロ以外の戻り値によって通知されますが、ゼロ以外のコードの解釈方法に関する標準はありません。また、他の人が述べたように、 void main()はC ++標準によって明示的に禁止されており、使用すべきではありません。有効なC ++の main 署名は次のとおりです。

int main()

and

int main(int argc, char* argv[])

これは同等です

int main(int argc, char** argv)

C ++では、 int main()をreturn-statementなしで残すこともできます。この時点では、デフォルトで0が返されます。これはC99プログラムでも同様です。 return 0; を省略するかどうかは、議論の余地があります。有効なCプログラムのメインシグネチャの範囲ははるかに大きくなります。

また、効率は main 関数の問題ではありません。 C ++標準に従って、プログラムの開始と終了をマークして、一度だけ入力および終了できます。 Cの場合、大文字と小文字は異なり、 main()の再入力は許可されますが、避けてください。

他のヒント

受け入れられた答えはC ++をターゲットにしているように見えるので、Cに関連する答えを追加すると思いましたが、これはいくつかの点で異なります。

ISO / IEC 9899:1989(C90):

main()は次のいずれかとして宣言する必要があります。

int main(void)
int main(int argc, char **argv)

または同等のもの。たとえば、 int main(int argc、char * argv [])は2番目のものと同等です。さらに、 int 戻り値の型はデフォルトなので省略できます。

実装で許可されている場合、 main()は他の方法で宣言できますが、これによりプログラム実装が定義され、厳密に適合しなくなります。

標準では、厳密に準拠する(つまり、実装定義の動作に依存しない)戻り値として3つの値を定義しています。正常に終了する場合は 0 および EXIT_SUCCESS 終了に失敗した場合は EXIT_FAILURE 。その他の値は非標準であり、実装が定義されています。未定義の動作を避けるため、 main()の最後には明示的な return ステートメントが必要です。

最後に、標準の観点からは、プログラムから main()を呼び出しても問題はありません。

ISO / IEC 9899:1999(C99):

C99の場合、以下を除いてすべてが上記と同じです。

  • int 戻り値の型は省略できません。
  • main()からreturnステートメントを省略できます。実行し、 main()が終了すると、暗黙的な return 0 があります。

標準C—ホスト環境

ホスト環境(通常の環境)の場合、C11標準(ISO / IEC 9899:2011)は次のように述べています。

  

5.1.2.2.1プログラムの起動

     

プログラムの起動時に呼び出される関数の名前は main です。実装はnoを宣言します   この関数のプロトタイプ。戻り値の型は int で定義され、   パラメータ:

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

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

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

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

     

宣言されている場合、メイン関数へのパラメーターは以下に従うものとします   制約:

     
      
  • argc の値は非負でなければなりません。
  •   
  • argv [argc] はNULLポインターでなければなりません。
  •   
  • argc の値がゼロより大きい場合、配列メンバー argv [0] 〜    argv [argc-1] には、指定された文字列へのポインタが含まれます。   プログラム起動前のホスト環境による実装定義の値。の   意図は、プログラムの起動前に決定されたプログラム情報を提供することです   ホスト環境の他の場所から。ホスト環境に対応していない場合   大文字と小文字の両方で文字を含む文字列を提供する、実装   文字列が小文字で受信されるようにします。
  •   
  • argc の値がゼロより大きい場合、 argv [0] が指す文字列   プログラム名を表します。 argv [0] [0] は、   プログラム名はホスト環境から使用できません。 argc の値が   1より大きい、 argv [1] から argv [argc-1] が指す文字列   プログラムパラメータを表します。
  •   
  • パラメータ argc および argv および argv 配列が指す文字列   プログラムによって変更可能であり、プログラム間で最後に保存された値を保持する   起動とプログラムの終了。
  •   
     

10)したがって、 int は、 int として定義されたtypedef名、または argv は次のように記述できます。    char ** argv など。

C99またはC11でのプログラムの終了

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

  

5.1.2.2.3プログラムの終了

     

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

     

11) 6.2.4に従って、 main で宣言された自動ストレージ期間を持つオブジェクトのライフタイム   前者の場合は終了しますが、後者の場合は終了しません。

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

C89(およびMicrosoft C)では、thereは、 main()関数が戻るが、戻り値を指定しない場合に何が起こるかについてのステートメントではありません。したがって、未定義の動作につながります。

  

7.22.4.4 exit 関数

     

¶ 5最後に、制御はホスト環境に戻ります。 status の値がゼロまたは EXIT_SUCCESS の場合、ステータス successful termination の実装定義形式が返されます。 status の値が EXIT_FAILURE の場合、ステータス unsuccessful termination の実装定義形式が返されます。それ以外の場合、返されるステータスは実装定義です。

標準C ++—ホスト環境

C ++ 11標準(ISO / IEC 14882:2011)は次のように述べています:

  

3.6.1メイン関数[basic.start.main]

     

¶ 1プログラムには、プログラムの指定された開始であるmainと呼ばれるグローバル関数が含まれます。 [...]

     

¶ 2実装は、メイン関数を事前定義しません。この機能はオーバーロードされません。それは   戻り値の型はint型ですが、それ以外の場合、その型は実装定義です。   すべての実装   mainの次の定義の両方を許可するものとします。

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

and

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

後者の形式では、 argc は、環境からプログラムに渡される引数の数です。   プログラムが実行される場所。 argc がゼロ以外の場合、これらの引数は argv [0] で提供されます。   ヌル終了マルチバイト文字列(NTMBS)(17.5.2.1.4.2)および argv [0] の最初の文字へのポインタとして argv [argc-1] までを表すNTMBSの最初の文字へのポインタ   プログラムの呼び出しに使用される名前または"" argc の値は非負でなければなりません。 argv [argc] の値   [注: argv の後に、さらに(オプションの)パラメーターを追加することをお勧めします。 —終了   注]

     

¶ 3関数 main はプログラム内で使用されません。 main のリンケージ(3.5)は実装定義です。 [...]

     

¶ 5 mainのreturnステートメントには、main関数を終了する効果があります(自動でオブジェクトを破棄する   ストレージ期間)、引数として戻り値を指定して std :: exit を呼び出します。制御が終わりに達した場合   returnステートメントに出会わずにmainを実行すると、結果は実行されます

return 0;

C ++標準では、明示的に「It [メイン関数]は戻り値の型が int でなければならないが、それ以外の場合はその型は実装定義」であり、Cと同じ2つの署名が必要ですオプションとしてサポートされる標準。したがって、「void main()」はC ++標準では直接許可されていませんが、代替を許可する非標準の実装を停止することはできません。 C ++では、ユーザーが main を呼び出すことを禁止しています(ただし、C標準では禁止しています)。

C#11標準には§ 7.22.4.4の段落と同一の§ 18.5 開始と終了の段落があります EXIT_SUCCESS および EXIT_FAILURE で定義されていることを文書化した脚注を除き、C11標準のexit 関数(上記で引用) >< cstdlib> )。

標準C—共通の拡張子

通常、Unixシステムは3番目のバリアントをサポートしています:

int main(int argc, char **argv, char **envp) { ... }

3番目の引数は、文字列へのポインターのヌル終了リストです。各リストは、名前、等号、および値(空の場合もある)を持つ環境変数です。これを使用しない場合でも、「 extern char ** environ; 」で環境にアクセスできます。のためにかつて、それはそれを宣言したヘッダーを持っていませんでしたが、 POSIX 2008標準は今それを必要とします< unistd.h> で宣言されます。

これは、付録Cに文書化されている共通の拡張機能としてC標準によって認識されています。

  

J.5.1環境引数

     

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

Microsoft C

Microsoft VS 2010 コンパイラは興味深いです。ウェブサイトは言う:

  

mainの宣言構文は次のとおりです

 int main();
     

または、オプションで、

int main(int argc, char *argv[], char *envp[]);
     

あるいは、 main および wmain 関数は、 void (戻り値なし)を返すように宣言できます。 main または wmain をvoidを返すと宣言した場合、returnステートメントを使用して親プロセスまたはオペレーティングシステムに終了コードを返すことはできません。 main または wmain void として宣言されているときに終了コードを返すには、 exit 関数を使用する必要があります。

void main()を含むプログラムが終了したときに何が起こるか(親またはOSにどの終了コードが返されるか)は明確ではありません。また、MS Webサイトもサイレントです。

興味深いことに、MSは、CおよびC ++標準が必要とする main()の2引数バージョンを規定していません。 3番目の引数が環境変数のリストへのポインターである char ** envp である3つの引数形式のみを規定します。

Microsoftページには、他のいくつかの代替手段もリストされています— wmain()はワイド文字列などを受け取ります。

Microsoft Visual  Studio  2005 バージョンのこのページには void main()。 Microsoft バージョン = "http://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Visual_Studio_2008" rel = "noreferrer"> Visual  Studio  2008 以降は

標準C—独立した環境

前述のとおり、上記の要件はホスト環境に適用されます。自立型の環境(ホストされた環境の代替)で作業している場合、標準には言うべきことがほとんどありません。独立した環境では、プログラムの起動時に呼び出される関数を main と呼ぶ必要はなく、戻り値の型に制約はありません。標準には次のように書かれています:

  

5.1.2実行環境

     

2つの実行環境が定義されています:独立型とホスト型。両方の場合において、   指定されたC関数が実行によって呼び出されると、プログラムの起動が発生します。   環境。静的ストレージ期間を持つすべてのオブジェクトは、プログラムの起動前に初期化(初期値に設定)する必要があります。それ以外の場合、このような初期化の方法とタイミングは指定されていません。プログラムの終了は、制御を実行環境に戻します。

     

5.1.2.1独立した環境

     

独立した環境(Cプログラムの実行はオペレーティングシステムの利点なしで行われる可能性がある)では、プログラムの起動時に呼び出される関数の名前とタイプは実装定義されています。李独立したプログラムで利用可能な、第4節で必要な最小限のセット以外のブレーリー施設は、実装定義です。

     

自立環境でのプログラム終了の効果は実装定義です。

第4節への相互参照は、これを指します:

  

¶ 5 厳密に準拠するプログラムは、この国際規格で指定されている言語およびライブラリの機能のみを使用するものとします。 3)出力依存を生成しません未指定、未定義、または実装定義の動作で、最小実装制限を超えてはなりません。

     

¶ 6適合実装の2つの形式は、 hosted freestanding です。 準拠するホスト型実装は、厳密に準拠するプログラムを受け入れます。 適合した自立型の実装は、ライブラリ節(7節)で指定された機能の使用が標準ヘッダー< float.h&gtの内容に限定されている厳密に適合したプログラムを受け入れます。 ; < iso646.h> < limits.h> < stdalign.h> 、   < stdarg.h> < stdbool.h> < stddef.h> < stdint.h&gt ; 、および   < stdnoreturn.h> 。準拠する実装には拡張機能が含まれる場合があります(   追加のライブラリ関数)、厳密に適合するプログラムの動作を変更しない限り。 4)

     

¶ 7 適合プログラムは、適合実装に受け入れられるものです。 5)

     

3)厳密に適合するプログラムは、関連マクロを使用する適切な条件付き包含前処理指令によって使用が保護されていれば、条件付き機能(6.10.8.3を参照)を使用できます。例:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif
     

4)これは、準拠する実装がこの国際標準で明示的に予約されている識別子以外の識別子を予約しないことを意味します。

     

5)厳密に準拠するプログラムは、準拠する実装間で最大限に移植できるように意図されています。適合プログラムは、適合実装の移植性のない機能に依存する場合があります。

実際に任意の関数を定義する独立した環境に必要なヘッダーは< stdarg.h> だけです(さらに、これらは—であり、多くの場合&#8212です;マクロのみ)。

標準C ++—独立した環境

C標準がホスト環境と自立環境の両方を認識するように、C ++標準も同様です。 (ISO / IEC 14882:2011からの引用)

  

1.4実装コンプライアンス[intro.compliance]

     

¶ 7 2種類の実装が定義されています:ホスト型実装自立型実装。ホストされた実装の場合、この国際標準は利用可能なライブラリのセットを定義します。自立   実装とは、オペレーティングシステムの恩恵を受けることなく実行できるものであり、特定の言語サポートライブラリ(17.6.1.3)を含む実装定義のライブラリセットを備えています。

     

¶ 8適合した実装は、整形式プログラムの動作を変更しない限り、拡張機能(追加のライブラリ関数を含む)を持つことができます。プログラムを診断するには実装が必要です   この国際標準に従って不正な形式の拡張機能を使用してください。ただし、そうすれば、そのようなプログラムをコンパイルして実行できます。

     

¶ 9各実装には、サポートされていないすべての条件付きでサポートされている構成を特定し、すべてのロケール固有の特性を定義するドキュメントを含めるものとします。 3

     

3)これ

main() EXIT_SUCCESS または EXIT_FAILURE のいずれかを返すはずだと思います。それらは stdlib.h

で定義されています

CおよびC ++標準では、自立型とホスト型の2種類の実装が定義されていることに注意してください。

  • C90ホスト環境

    許可されたフォーム 1

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */
    

    コメント:

    前者の2つは許可された形式として明示的に記述されていますが、他の2つはC90が「暗黙のint」を許可したため暗黙的に許可されています戻り値の型と関数のパラメーター。他のフォームは許可されていません。

  • C90自立環境

    mainの任意の形式または名前を使用できます 2

  • C99ホスト環境

    許可されたフォーム 3

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    

    コメント:

    C99は「暗黙的なint」を削除しました;そのため、 main()は無効になりました。

    奇妙なあいまいな文「または他の実装定義の方法」導入されました。これは、「 int main()のパラメーターは異なる場合があります」と解釈できます。または、" mainは、実装定義の形式をとることができます"。

    一部のコンパイラは、後者の方法で標準を解釈することを選択しました。おそらく、曖昧であるため、標準を引用することで厳密に準拠していないと簡単に述べることはできません。

    ただし、 main()の完全にワイルドな形式を許可することは、おそらくこの新しい文の意図ではありませんでした(?)。 C99の理論的根拠(規範的ではない)は、この文が int main 4 への追加パラメーターを参照していることを意味します。

    ホスト環境プログラムの終了セクションでは、mainがint 5 を返さない場合について議論します。このセクションは、mainの宣言方法に関する規範ではありませんが、ホストされたシステム上でもmainが完全に実装定義された方法で宣言される可能性があることを確実に暗示しています。

  • C99自立環境

    メインの任意の形式または名前を使用できます 6

  • C11ホスト環境

    許可されたフォーム 7

    int main ()
    int main (int argc, char *argv[])
    
  • C11自立環境

    メインの任意の形式または名前を使用できます 8


int main()は、上記のバージョンのCのホストされた実装の有効なフォームとしてリストされていなかったことに注意してください。 Cでは、C ++とは異なり、()(void)の意味は異なります。前者は、言語から削除される可能性のある廃止された機能です。 C11の今後の言語の指示を参照してください。

  

6.11.6関数宣言子

     

(プロトタイプ形式のパラメータ型宣言子ではなく)空の括弧を使用した関数宣言子の使用は、廃止された機能です。


  • C ++ 03ホスト環境

    許可されたフォーム 9

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    

    コメント:

    最初の形式の空の括弧に注意してください。この場合、C ++とCは異なります。C++では、これは関数がパラメーターを受け取らないことを意味するためです。ただし、Cでは、任意のパラメーターを使用できることを意味します。

  • C ++ 03自立環境

    起動時に呼び出される関数の名前は実装定義です。 main()という名前の場合、指定された形式 10 に従う必要があります:

    int main(void) { /* ... */ } 
    
  • C ++ 11ホスト環境

    許可されたフォーム 11

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

    コメント:

    標準のテキストは変更されましたが、同じ意味を持っています。

  • C ++ 11自立環境

    起動時に呼び出される関数の名前は実装定義です。 main()という名前の場合、指定された形式 12 に従う必要があります:

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

参照

  1. ANSI X3.159-1989 2.1.2.2ホスト環境。 "プログラムの起動"

      

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

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

    または2つのパラメーター(ここでは   argcおよびargv。ただし、それらはローカルにあるため、任意の名前を使用できます。   それらが宣言されている関数):

    <*>
  2. ANSI X3.159-1989 2.1.2.1自立環境:

      

    独立した環境(Cプログラムの実行には時間がかかる可能性があります)   オペレーティングシステムのメリットのない場所)、名前とタイプ   プログラムの起動時に呼び出される関数の実装定義です。

  3. ISO 9899:1999 5.1.2.2ホスト環境-&gt; 5.1.2.2.1プログラムの起動

      

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

    <*>
      

    または2つのパラメーター(ここでは   argcおよびargv。ただし、それらはローカルにあるため、任意の名前を使用できます。   それらが宣言されている関数):

    <*>
      

    または同等; 9)または他の実装定義   マナー。

  4. 国際標準の根拠&#8212;プログラミング言語&#8212; C、リビジョン5.10 5.1.2.2ホスト環境-&gt; 5.1.2.2.1プログラムの起動

      

    mainの引数の動作、exit、main、およびatexitの相互作用の動作   (&#167; 7.20.4.2を参照)は、argvの表現の不要な多様性を抑制するために成文化されました   文字列、およびmainによって返される値の意味。

         

    mainの引数としてのargcとargvの仕様は、広範囲にわたる従来の慣行を認識しています。   argv [argc]は、一般的な慣行にもとづいて、リストの最後に冗長なチェックを提供するためにNULLポインターである必要があります。

         

    mainは、0個または2個の引数で移植可能に宣言できる唯一の関数です。 (他の関数の数&#8217;引数は呼び出しと定義の間で正確に一致する必要があります。)   この特殊なケースは、プログラムがプログラムの引数文字列にアクセスしない場合にmainの引数を除外するという広く行われている慣行を単に認識しています。多くの実装はmainに対する3つ以上の引数をサポートしていますが、そのような慣行は標準によって祝福も禁止もされていません。 mainを3つの引数で定義するプログラムは厳密には準拠していません(&#167; J.5.1を参照)。

  5. ISO 9899:1999 5.1.2.2ホスト環境-&gt; 5.1.2.2.3プログラムの終了

      

    メイン関数の戻り値の型がintと互換性のある型である場合、メイン関数への最初の呼び出しからの戻り値は、メイン関数から返された値を引数としてexit関数を呼び出すことと同等です; 11)メイン関数を終了する} は値0を返します。戻り値の型がintと互換性がない場合、ホスト環境に返される終了ステータスは指定されていません。

  6. ISO 9899:1999 5.1.2.1独立した環境

      

    独立した環境(Cプログラムの実行はオペレーティングシステムの利点なしで実行される可能性がある)では、プログラムの起動時に呼び出される関数の名前と型は実装定義です。

  7. ISO 9899:2011 5.1.2.2ホスト環境-&gt; 5.1.2.2.1プログラムの起動

    このセクションは、上記で引用したC99と同じです。

  8. ISO 9899:1999 5.1.2.1独立した環境

    このセクションは、上記で引用したC99と同じです。

  9. ISO 14882:2003 3.6.1メイン関数

      

    実装はmaを事前定義してはならない

成功すると0を返し、エラーでは0以外を返します。これは、プログラムで何が起こったかを調べるために、UNIXおよびDOSスクリプトで使用される標準です。

C89およびK&amp; R Cの

main()の戻り値の型は、デフォルトで&#8217; int`になります。

return 1? return 0?
  1. int main()でreturnステートメントを記述しない場合、閉じている {はデフォルトで0を返します。

  2. return 0 または return 1 は、親プロセスによって受信されます。シェルでは、シェル変数に入ります。シェルからプログラムを実行していて、その変数を使用しない場合、 main()の戻り値を心配する必要はありません。

メイン関数が返したものを取得するにはどうすればよいですかを参照してください。

$ ./a.out
$ echo $?

これにより、 main()の戻り値の最下位バイトを受け取る変数 $?であることがわかります。

UnixおよびDOSスクリプトでは、成功した場合は return 0 が、エラーの場合はゼロ以外が通常返されます。これは、プログラムおよびフロー全体の制御で発生したことを調べるために、UnixおよびDOSスクリプトで使用される標準です。

intを返している場合でも、一部のOS(Windows)は戻り値を1バイト(0〜255)に切り捨てることに注意してください。

オペレーティングシステムは、戻り値を使用して、プログラムがどのように閉じられたかを確認できます。

通常、ほとんどのオペレーティングシステム(とにかく考えられるもの)では、戻り値0はOKを意味します。

プロセスを自分で呼び出したときにも確認でき、プログラムが正常に終了して終了したかどうかを確認できます。

これは単なるプログラミング規則ではありませんではありません

main()の戻り値は、プログラムの終了方法を示します。戻り値が zero である場合、実行が成功したことを意味しますが、ゼロ以外の値は実行で何かがうまくいかなかったことを表します。

標準では、成功の戻り値はOSベースであるため、メインは戻り値を必要としないと規定されているという印象を受けました(1つのゼロは別の成功または失敗の可能性があります)。コンパイラが成功したリターン自体を挿入するためのキュー。

ただし、通常は0を返します。

0を返すと、プログラムがジョブを正常に終了したことをプログラマーに伝える必要があります。

return 0 を省略

CまたはC ++プログラムが main の最後に達すると、コンパイラは0を返すコードを自動的に生成するため、 return 0; を明示的に置く必要はありません。 main の終わり。

注:この提案を行うと、ほぼ必ず2種類のコメントのいずれかが続きます。「それを知りませんでした」。または&quot;それは悪いアドバイスです!&quot;私の理論的根拠は、標準で明示的にサポートされているコンパイラの動作に依存することが安全で便利だということです。 Cの場合、C99以降。 ISO / IEC 9899:1999セクション5.1.2.2.3を参照してください:

  

[...] main 関数の最初の呼び出しからの戻りは、 main <によって返された値で exit 関数を呼び出すことと同等です。引数としての/ code>関数。 main 関数を終了する} に到達すると、値0が返されます。

C ++の場合、1998年の最初の標準以来。 ISO / IEC 14882:1998セクション3.6.1を参照してください:

  

returnステートメントに遭遇せずにmainの最後に制御が到達した場合、return 0を実行する効果があります。

それ以降の両方の標準のすべてのバージョン(C99およびC ++ 98)は、同じ考え方を維持しています。 C ++で自動的に生成されるメンバー関数に依存しており、 void 関数の最後に明示的な return; ステートメントを記述する人はほとんどいません。省略しない理由は、&quot;奇妙に見える&quot; 。私のように、C標準への変更の理論的根拠に興味がある場合この質問を読む。また、1990年代初頭、これは「ずさんな練習」と見なされていたことにも注意してください。なぜなら、当時は未定義の動作でした(広くサポートされていましたが)。

さらに、 C ++コアガイドラインには、複数の省略インスタンスが含まれています return 0; main の最後にあり、明示的な戻り値が書き込まれるインスタンスはありません。その文書にはこの特定のトピックに関する特定のガイドラインはまだありませんが、それは少なくとも実践の暗黙の承認と思われます。

したがって、私はそれを省略することを推奨します。他の人は同意しない(しばしば激しく!)いずれにせよ、それを省略したコードに出くわすと、標準で明示的にサポートされていることがわかり、その意味がわかります。

何を返すかは、実行可能ファイルで何をしたいかによって異なります。たとえば、プログラムをコマンドラインシェルで使用している場合、成功の場合は0を返し、失敗の場合は0以外を返す必要があります。次に、コードの結果に応じて、条件付き処理でシェルでプログラムを使用できます。また、解釈に従ってゼロ以外の値を割り当てることができます。たとえば、重大なエラーの場合、異なるプログラム出口点が異なる出口値でプログラムを終了させる可能性があり、呼び出したシェルは返された値を調べることで何をするかを決定できます コードがシェルでの使用を目的としておらず、戻り値が誰にもわからない場合は、省略される可能性があります。私は個人的に署名 int main(void){.. return 0; ..}

プロセスから整数を返す効率に本当に問題がある場合は、おそらく、この戻り値が問題になるほどそのプロセスを何度も呼び出さないでください。

これを行う(プロセスを何度も呼び出す)場合、呼び出しごとに特定のプロセスを割り当てることなく、ロジックを呼び出し元またはDLLファイル内に直接配置する方法を見つける必要があります。この場合、複数のプロセスの割り当てにより、関連する効率の問題が発生します。

詳細には、0を返すことが1よりも多かれ少なかれ効率的かどうかだけを知りたい場合、コンパイラに依存する場合がありますが、一般的には、同じソース(ローカル、フィールド、定数、コードに埋め込まれている、関数の結果など)、まったく同じクロックサイクル数が必要です。

  

CおよびC ++でmain()関数を定義する正しい(最も効率的な)方法は何ですか&#8212; int main()またはvoid main()&#8212;そしてその理由は?

これらの単語&quot;(最も効率的)&quot;質問を変更しないでください。自立した環境にいる場合を除き、 main()を宣言する普遍的に正しい方法が1つあり、それはintを返します。

  

CおよびC ++では main()は何を返す必要がありますか?

すべき main()が返すものではなく、する main()が返すものです。 main()は、もちろん、他の誰かが呼び出す関数です。 main()を呼び出すコードを制御することはできません。したがって、呼び出し元と一致するように、タイプが正しい署名で main()を宣言する必要があります。あなたは単にその問題に選択肢がありません。答えは、CおよびC +標準によってすでに完全に明確に定義されているため、効率が高いか低いか、スタイルが良いか悪いかなどを自問する必要はありません。従うだけです。

  

int main()の場合、1を返すか0を返しますか?

成功の場合は

0、失敗の場合はゼロ以外。繰り返しになりますが、選択する(または取得する)必要があるものではありません。準拠することになっているインターフェースによって定義されます。

ここでは、リターン コードの使用法の簡単なデモンストレーションを示します。

Linux ターミナルが提供するさまざまなツールを使用する場合、プロセス完了後のエラー処理などにリターン コードを使用できます。次のテキスト ファイル myfile が存在すると想像してください。

これは grep がどのように機能するかを確認するための例です。

grepコマンドを実行するとプロセスが作成されます。処理が完了すると (中断されなかった場合)、0 から 255 までのコードが返されます。例えば:

$ grep order myfile

もし、するなら

$ echo $?
$ 0

0 が返されます。なぜ?なぜなら grep 一致するものが見つかり、終了コード 0 が返されました。これは、正常に終了する場合の通常の値です。もう一度チェックしてみましょう。ただし、テキスト ファイル内にないものがあるため、一致するものは見つかりません。

$ grep foo myfile
$ echo $?
$ 1

grep はトークン「foo」とファイルの内容の一致に失敗したため、戻りコードは 1 になります (これは失敗が発生した場合の通常のケースですが、上で述べたように、選択できる値はたくさんあります)。

次の bash スクリプト (Linux ターミナルに入力するだけ) は非常に基本的ではありますが、エラー処理のアイデアを提供するはずです。

$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found

2 行目以降は、「foo」によって grep が 1 を返し、grep の戻りコードが 0 に等しいかどうかをチェックするため、端末には何も表示されません。2 番目の条件ステートメントは、CHECK == 1 により true であるため、最後の行のメッセージをエコーし​​ます。

さまざまなプロセスを呼び出している場合にわかるように、(main() の戻り値によって) 何が返されたかを確認することが重要な場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top