かの有効な署名のためのCのmain()機能しているのでしょうか。
-
22-09-2019 - |
質問
かの有効な署名のための主な機能。知ってい:
int main(int argc, char *argv[])
ありその他有効ですか。
解決
現在の標準時点においてこの答え(C11)を明示的に記載され:
int main(void);
int main(int argc, char* argv[]);
はなのフレーズ"または同等"を以下の注記事項については、中間:
このように、
int
に置き換えることができるtypedef
名称の定義int
, の種類argv
と表すことができchar ** argv
, います。
また、が加えられるようにもなっています(実装で定義されています)。
の関連のセクション(C11部5.1.2.2.1が、この特定の側面から大きな変更はないC99)
機能の呼び出プログラム起動時の名前
main
.の実施を宣言しない試作品のためこの機能です。で定義しなければ、戻り値の型int
ないパラメータ:int main(void) { /* ... */ }
またはその二つのパラメータ(こ
argc
やargv
, ていなかったの名前を使用しての機能を宣言されてい):int main(int argc, char *argv[]) { /* ... */ }
または同等;又はその他の実装で定義されています。
その宣言のパラメータの
main
機能項を遵守以下の制約:
の値
argc
は負でない.
argv[argc]
は、nullポインタです。の場合の値の
argc
がゼロより大きい場合、配列員argv[0]
を通じてargv[argc-1]
包摂されている事項を、ポインタの文字列を与える実装によって定義される価値は、ホスト環境を事前にプログラムで起動します。この目的は、供給のプログラム情報の前に決定プログラム起動時のその他の場所から開催。の場合はホスト環境を供給できる文字列の文字の両方の大文字と小文字は、実施の責文字列を受けた小文字を使用します。の場合の値の
argc
がゼロより大きい場合、文字列によって指定されたargv[0]
のプログラム名argv[0][0]
当する場合は、null文字の場合には、本プログラムに名前が表に出ることはありませんからのご利用は、ホスト環境です。の場合の値のargc
より大きい一つの文字列によって指定されたargv[1]
を通じてargv[argc-1]
を代表するプログラムパラメータ。パラメータ
argc
やargv
の文字列を指摘し、argv
配列は変更可能のプログラム及びその最終格納値の間にプログラムの起動やプログラム終了した後も有効とします。
これは、主催の環境もよく知られているので非常にCます。無料の立環境などの組み込みシステム)はこの制約に記載された5.1.2.1同規格:
一緒に環境にするCプログラム実行されてしまう可能性のあるなしに利益をレーティングシステム)の名前タイプの機能と呼ばれるもので、プログラム起動時は実装で定義されています。他の図書館施設を利用可能で自立プログラム等、最小限の設定により必要項第4に、実装で定義されています。
他のヒント
標準C
ホストされた環境では、(通常の一つだ)、C99標準は述べています:
5.1.2.2.1プログラムの起動
プログラムの起動時に呼び出される関数が
main
という名前です。実装はありません宣言する この関数のプロトタイプ。それはint
の戻り値の型となしで定義されなければなりません パラメータ:int main(void) { /* ... */ }
または任意の名前があってもよいが、
argc
とargv
としてここで呼ばれる2つのパラメータ(と 使用、彼らはそれらが宣言された関数)にローカルなようます:int main(int argc, char *argv[]) { /* ... */ }
または同等物; 9)またはいくつかの他の実装定義の方法で
。9)はこのように、
int
がint
として定義のtypedef名で置き換えることができ、又はargv
のタイプのように書くことができます。char **argv
、というように。
C11とC18標準は、C99標準と本質的に同じと言っています。
標準C ++
C ++ 98標準氏は述べています:
3.6.1メイン関数[basic.start.main]
1 Aプログラムは、プログラムの指定された開始であるメインというグローバル関数を含まなければなりません。 [...]
2アンの実装では、主な機能をあらかじめ定義してはなりません。この機能は、オーバーロードしてはなりません。それはなら int型の戻り値の型を持っていますが、そうでない場合は、そのタイプは、実装が定義されています。 すべての実装 メインの次の定義の両方を許可するものとします:
int main() { /* ... */ }
と
int main(int argc, char* argv[]) { /* ... */ }
C ++標準では、明示的に「それ[主な機能]はint型の戻り値の型を持たなければならないが、それ以外のタイプが定義された実装がある」と言い、およびCの標準と同じ2人の署名が必要です。だから、「無効メイン()」は、(標準の拡張機能などの代替が可能でも、標準準拠の実装)が可能な代替の非標準準拠の実装を停止するために行うことができます何もないのに、直接、C ++標準によって許可されていません。
++ 03 C、C ++ 11、C ++ 14、およびC ++ 17の標準は、本質的にC ++ 98と同じ言う。
一般的な拡張
古典的には、Unixシステムは、第三の変形をサポートしています:
int main(int argc, char **argv, char **envp) { ... }
は3番目の引数は、符号、および値(空)に等しく、名前を持つ環境変数であり、その各々は、文字列へのポインタのNULLで終了するリストです。あなたはこれを使用しない場合でも、「extern char **environ;
」を介しての環境で得ることができます。長い間、それはそれを宣言したヘッダーを持っていなかったが、POSIX 2008標準は、今、それが<unistd.h>
内で宣言されている必要があります。
これは、付属書Jに記載の一般的な拡張としてC規格によって認識される
J.5.1環境引数
¶1ホスト環境では、主な機能は、第三の引き数、
char *envp[]
を受信します ストリングを指しそれぞれがchar
へのポインタのNULLで終了する配列を指し、その プログラム(5.1.2.2.1)のこの実行のための環境についての情報を提供します。
マイクロソフトC
マイクロソフトVS 2010 のコンパイラが面白いです。ウェブサイトは述べています:
メインのための宣言構文がある
int main();
または、必要に応じて、
int main(int argc, char *argv[], char *envp[]);
はまた、
main
とwmain
機能はvoid
(ノーリターン値)を返すように宣言することができます。あなたはvoidを返すようmain
またはwmain
を宣言する場合は、return文を使って、親プロセスまたはオペレーティングシステムに終了コードを返すことができません。main
またはwmain
が宣言されたときに終了コードを返すにはvoid
として、あなたはexit
関数を使用する必要があります。
何が起こるか私には明確ではない(親に返されるかされているものの終了コードO / S)void main()
とプログラムが終了しない場合 - 。とMSのウェブサイトがあまりにも静かです。
興味深いことに、MSは、CおよびC ++標準規格が必要とするmain()
の2引数バージョンを規定していません。それは唯一の3番目の引数がchar **envp
、環境変数のリストへのポインタである3つの引数形式を規定します。
wmain()
、およびいくつかのより多くの - は、Microsoftのページには、いくつかの他の選択肢を示しています
のマイクロソフトVS 2005年版このページの代替としてではないリストvoid main()
を行います。 バージョンは以降のMicrosoft VS 2008からをやるます。
であるint main()
int main(void)
と同じ?
詳細な分析については、<のhref = "https://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c/18721336への私の答えの最後を参照してください? S = 2 | 96.4912#18721336" > CおよびC ++ の中でリターンをmain()
べきこと。 (それは私がかつてこの質問は、それはしなかったし、決してないにも関わらず、C ++に言及すると考えているようです。ではC ++は、そこint main()
とint main(void)
とint main()
の間に違いはありません慣用C ++である。)
Cで、2つの表記の違いはありますが、あなただけの難解なケースではそれに気づきます。あなたがCで行うことを許可されyou'e独自のコードからmain()
関数を呼び出し、C ++で行うことを許可されていない場合は具体的には、違いがあります。
int main()
表記はmain()
のプロトタイプを提供していませんが、あなたは再帰的に呼び出す場合ということにのみ重要。 int main()
と、後で(同じ機能で、または別の関数内の)書き込みint rc = main("absolute", "twaddle", 2):
可能性があり、それが合法と(それについて(警告を表示)文句を言うかもしれませんが、正式にコンパイラは、コードをコンパイルするために拒否の範囲に文句を言うべきではありませんGCCとの-Werror
を使用する)エラーに警告を変換します。あなたがint main(void)
を使用する場合は、main()
への後続の呼び出しは、エラーを生成する必要があります - あなたは、関数が引数を取らないと述べたが、3つを提供しようとしました。実装がmain()
のプロトタイプを宣言していない - もちろん、あなたが宣言された、または(あなたがまだC90のセマンティクスを使用していない限り)それを定義した前に、合法的にコールmain()
はできません。 NB:C11規格が異なる例でint main()
とint main(void)
の両方を示している - の両方がCで有効ですが、それらの間の微妙な違いがあるのにもかかわらず、
POSIX、execve()
をサポートするターンサポートで
int main(int argc, char *argv[], char *envp[])
追加引数は環境、フォーム名前=値の文字列のすなわち配列である。
http://en.wikipedia.org/wiki/Main_function_ (プログラミング)#C_and_C.2B.2B の
のMac OS X上で通常のint main(int argc, char *argv[])
およびPOSIX int main(int argc, char **argv, char **envp)
は、またサポートしています。
int main(int argc, char* argv[], char* envp[], char* apple[]);
もちろんそれは、Mac専用です。
はWindowsでは
がありますint wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
ユニコード(実際には、ワイド文字)変種として。もちろんWinMain
もあります。
int main(void)
いくつかのOSの下で(例えば、Windowsの場合)も、そのようなは有効です。
int main(int argc, char **argv, char **envp)
envp
がgetenv()
を介してアクセスできそうでない場合は、環境を提供します。