3

A. C ++スタンドアロンプ​​ログラムのエントリポイント「メイン」を定義するために、次の試みは有効ですか?

namespace{
 extern int main(){return 0;}
}

私が理解している限り、これはC ++標準の「main」に関するすべての基準を満たしています(外部リンケージ、暗黙のusingディレクティブのためにグローバル名前空間で使用可能)。

では、このプログラムは形式が正しくないのですか、そしてその理由は何ですか?規格への言及はありますか?

B. EXIT_FAILUREとEXIT_SUCCESSについて説明しましたが、EXIT_SUCCESSを常に0にする必要があるかどうかを結論付けることができません。これは、標準に従って、「main」にreturnステートメントを省略することはreturn0と同等であるためです。常に0である。

$ 18.3-「ステータスがゼロまたはEXIT_SUCCESSの場合、実装で定義された形式のステータス正常終了が返されます。」

4

3 に答える 3

2

ここでnamespace { }は、匿名の名前空間があります - そこからグローバル名前空間に逃げるべきものは何もないという考えです - 実際には、他の翻訳単位と衝突しない何かを前に付ける必要があります。あなたはそれを作ったexternが、そうではないextern "C"ので、メインが壊れていないという特別なルールはそれを保護せず、シンボルはリンケージ要件を満たさない. とにかく、匿名の名前空間内に extern を入れることは、単に混乱した考えです。あなたは常に、標準を奇妙なゆがみにねじ曲げることができる方法を確認するために邪魔をしません:-)。興味があります - 理由はありますか? これに学術的に興味がありますか、それともコンパイラーまたはコンパイラー・テスト・スイートなどの実装に興味がありますか?

EXIT_SUCCESS と EXIT_FAILURE の議論を質問に追加したことを確認してください。ここでの重要な点は、これらを main または exit() から使用でき、どのオペレーティング システムでも動作することがわかっていることです。0 を返す場合、EXIT_SUCCESS を使用するか、0 を使用するか、メインを「通過」させるかは問題ではありません。OS は、実際にはオペレーティング システムに 0 を返す場合と返さない場合があります。ランタイムがそれを、その OS で「成功」を意味する他の値にマップしている可能性があります。しかし、失敗の場合 - 0 以外の任意の値を返すと、そのマッピングをバイパスし、単純な失敗とは異なる何かを示しているか、たまたま成功値と一致する可能性があります。異なるオペレーティング システムでは、値の扱いも異なります。多くの場合 (Linux など)、戻り値の最下位 8 ビットを除くすべてが取り除かれます。

于 2010-09-08T02:52:14.650 に答える
1

A. C++ スタンドアロン プログラムのエントリ ポイント「main」を定義する次の試みは有効ですか?

いいえ。C++ 標準では、「プログラムには、グローバル関数という名前の関数を含める必要があります」と記載されていますmain(§3.6.1/1)。あなたのプログラムでは、main関数はグローバル名前空間にありません。名前のない名前空間にあります。

暗黙的な using ディレクティブは、名前のない名前空間からの名前を参照して、囲んでいる名前空間で使用することのみを許可します。それらの名前を外側の名前空間に追加しません。具体的には、「using ディレクティブは、それが表示される宣言領域にメンバーを追加しません」(§7.3.4/1)。

このプログラムは形式が正しくありませんか?その理由は?

プログラムの形式が必ずしも正しくないわけではありません。mainグローバル名前空間以外の名前空間で名前が付けられた関数を持つことに対するルールはありません。そのような機能は機能ではありませ mainnamespace { int main(); }int main()は 2 つの異なる関数であり、適切な形式のプログラムには両方を含めることができます。

プログラムがグローバル名前空間に関数を持っていない場合、mainそのプログラムは不正な形式であることに注意してください (前述のように、ホストされた環境のプログラムには main 関数が必要なため)。

B. と について話し合いましたEXIT_FAILUREが、常に である必要があるEXIT_SUCCESSかどうかについて結論を出すことができません。EXIT_SUCCESS0

EXIT_SUCCESSに展開する必要はありません0。C 標準では<stdlib.h>

定義されているマクロは...EXIT_FAILUREEXIT_SUCCESSあり、関数の引数として使用できる整数定数式に展開されexit、ホスト環境にそれぞれ失敗または成功の終了ステータスを返します (C99 §7.20/3)。

(これらの 2 つのマクロは で定義されている<cstdlib>ため、C 標準にはそれらの仕様が含まれています)。

于 2010-09-08T04:14:07.550 に答える
0

A. Visual C++ 2010 でコードを実行しようとすると、次のようになります。

エラー 1 エラー LNK1561: エントリ ポイントを定義する必要があります

C++ では、main はグローバル名前空間 (つまり ::main) にある必要があり、(クラスまたはインスタンス) メンバー関数にすることはできませんが、名前は予約されておらず、他の (通常の) メンバー関数または非メンバー関数に使用できます。機能。

終了ステータス

main 関数から返された値は、プロセスの終了ステータスになりますが、C 標準では、EXIT_SUCCESS (従来はゼロ) と EXIT_FAILURE の 2 つの値に特定の意味しか与えていません。他の可能な戻り値の意味は実装定義です。

詳しくはこちら

于 2010-09-08T02:51:39.843 に答える