void main(...)、int main(..)、int _tmain() の違い。それらはすべて単一入口および単一出口システムです。しかし、これらの起動関数をどのような状況で使用するのでしょうか?
2 に答える
void main()
無効です; C++ 標準ではmain
、 を返す必要がありint
ます。一部のコンパイラでは、それを回避できます。
int main()
2 つの標準形式の 1 つです。もう 1 つはint main(int argc, char *argv[])
、コマンドライン引数を受け取るために使用できる です。実装は他の形式を許可するかもしれませんが、必須ではありませんが、そのような形式はすべて返さなければなりませんint
。
int _tmain()
マイクロソフト固有のものです。
異なる実装が異なるエントリ ポイント (またはエントリ ポイントの選択) をサポートする理由は、OS や環境が異なれば、プログラムを実行する方法や、引数情報をプログラムに渡す方法も異なるためです。
C++ の実装には、次の 2 種類があります。
「ホストされた」実装は、ある種の OS の存在を前提としています。ホストされた実装でmain
は、適合プログラムで必要であり、 を返さなければなりませんint
。
「独立した」実装は、OS の存在を想定していません。独立した実装では、require を必要とするかどうかは実装次第ですmain
が、標準では、main
が必要な場合は を返さなければならないと言われていint
ます。
実装がホストされた実装の機能を提供するのは一般的な方法ですが、 以外のエントリ ポイントを許可しmain
ます。これは、ホストされた実装の標準に準拠していますが、定義する準拠プログラムmain
が受け入れられます。main
事実上、実装は、代わりに実装定義の代替を含む場合、機能のない特定の非準拠プログラムを (拡張として) 許可します。技術的には、「エラー」を診断する必要があると思いますが、実際には、そのような拡張機能を誤って使用する人はいないため、おそらく診断を見たくないでしょう。
同様に、準拠する実装は、 を含むプログラムを受け入れることができvoid main
ます。繰り返しになりますが、実装が準拠するには、プログラムが準拠していないことを診断する必要があります。
とにかく実装が受け入れる不適合プログラムの意味は、実装次第です。
_tmain
MS拡張です。main
これは、ナロー文字ビルドおよびwmain
ワイド文字ビルドでのエイリアスです。wmain
も MS 拡張であり、狭い文字列ではなく幅の広い文字列として提供されるmain
ことを除いては似ています。argv
したがって、これは、プログラムがナロー文字の範囲外 (つまり、8 ビット コード ページ外) の文字を処理するかどうかに応じて、プログラムに引数を与える 2 つの異なる方法がある環境の例です。