2016-07-05 8 views
3

私が知る限り、CまたはC++では、mainの署名はint main(void)voidはC++ではオプション)またはint main(int, char**)のいずれかでなければなりません。ただし、次のコードは、GCC /グラムで警告なし(-Wall -Wextra -Wpedantic)++ /打ち鳴らす/打ち鳴らす++mainの引数にCV修飾子を追加できますか?

int main(int, const char * const * const argv){} 

Live on Coliru

でコンパイル法的上記のコードですか?換言すれば、mainの引数にCV修飾子を追加できますか?これは単に診断を必要としないコンパイラの拡張ですか?

+0

追加できます。 – STF

+0

@STF私はそれを参照してください、しかし、いくつかの標準的な参照がありますか?私が覚えている限り、私は今、私の目の前に標準を持っていません。署名は 'int main()'や 'int main(int、char **)'、 'int main(int、char * [])'です。 – vsoftco

+1

@Galikなぜですか?ポインタは暗黙的に変換可能ではなく、標準的な配列間の崩壊ではありません。したがって、CV-qualsは署名の一部でなければなりません。多分私はここで何かを逃しているでしょう。 – vsoftco

答えて

4

C++11標準では、実装では、提示された2つだけの署名が必要な任意の署名を受け入れることができます。戻り値の型はintでなければなりません。

3.6.1主な機能 [basic.start.main]

実装が主な機能をあらかじめ定義してはなりません。この関数はオーバーロードしてはならない。これはint型の戻り値型を持ちますが、それ以外の型は実装定義です。

は、我々はCV-修飾子を追加することができます。

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

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

だから、メインの質問に対処するために:すべての実装が メインの次の定義の両方ができるようにするものメインの議論に?

我々はできる実装がそれをサポートしていますが、私たちがしなければ、コードがポータブルになりにくいの場合。

コードはそれだけではなく、その種類の尖った-にパラメータ変数自体へCV予選(最大で)追加した場合、完全に移植可能になります:CとC++は2異なることを覚えておいてください

// still portable, same signature as int main(int, char**) 
int main(int, char** const argv); 

// not portable 
int main(int, char* const* argv); 

// not portable 
int main(int, const char** argv); 
+0

ありがとう、クリスタルクリア! – vsoftco

+0

関数のシグネチャには戻り値の型( 'main'では' int')が含まれていないので、文字通り正しくなります。 –

+0

@ Cheersandhth.-Alfあなたは*がそうでなければその型は実装定義です*は戻り値の型を参照していますか? – vsoftco

3

言語。答えは両者でほぼ同じですが、特にC standardの言葉をカバーする価値があります - 特に言語弁護士のタグがあれば。 C15のN1570草案へのリンクです。

セクション5.1.2.2.1は、ホストされた実装のmainの定義を説明します。

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

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

または任意の名前かかわらargcargv、 とここで呼ばれる2つのパラメータ(とは、それらが宣言されている の関数にとってローカルなので、使用することができます)。

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

または同等品。または他の実装定義の方法で実装することができます。

添加const又はvolatile修飾子と定義が示す形態と同等ではないので、実装はそれを受け入れることを義務付けていません。しかし、そのセクションはの制約ではないので、実装についてもそれについて不平を言う必要はありません。具体的には、constおよび/またはvolatile修飾子を受け入れる実装文書の場合は、その実装の場合はとなります。

(実際には、ほとんどのコンパイラは、おそらく文句を言わないだろう。)

注意これが唯一のホストされた実装に適用されること。 (通常はなしOSと組み込みターゲット用)の自立実装について:

...プログラム 起動時に呼び出される関数の名前とタイプは、実装定義です。実装自立するための主な機能のないポータブル定義は(それもmain呼び出される必要はない)が存在しないことを意味する

(5.1.2.1項1)。

+0

標準引用符をありがとう! – vsoftco

関連する問題