- ベストアンサー
メイン関数
メイン関数には int main(void) と int main(int argc, char** argv) がありますが、後者のint argc, char** argv はどういう意味なのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こういう質問をするときは、環境を明確にした方がよいと思います。そうでないと一般論で回答しなければならず、どうしても表現があいまいになったり、非常に難しくなったりします。 argcとargvですが、これらはホスト環境がプログラムに情報を与えるために使用するものです。この情報は、プログラムの実行に先立ち、何らかの方法で決定されます。 具体的には、コマンドプロセッサを持つ環境の場合、プログラムを実行する際に付加した引数を渡すことになります。また、他のプログラムからexeclなどの処理系定義の方法を用いて呼び出した場合には、その呼出し時に指定した情報が渡されます。環境によっては、もっと別の方法で情報を定義するかもしれません。 argcが正の場合、argv[0]にはプログラム名が格納されます。このプログラム名がどんな形式で格納されるかは処理系に依存します。また、argv[argc]には空ポインタが格納されます。つまり、argcが0の場合、argv[0]は空ポインタになるため、mainの引数からプログラム名を知る手段がありません(そういう処理系が実在します)。 mainの最初の呼出しでは、argcが負になることはありません。 C言語では、mainは再帰的に呼び出すことができますので、2回目以降のmainの呼出しでは、argcとargvの意味は、プログラムでどんな引数を渡したかに依存します。
その他の回答 (3)
- chie65536
- ベストアンサー率41% (2512/6032)
Cのプログラムは、起動すると「いきなりmainから実行し始める」訳ではありません。 実は「実行時ライブラリ」が一緒に組み込まれ、プログラムは「実行時ライブラリで用意されたエントリポイント」から実行開始されます。 その「実行時ライブラリ」は、色々な初期化をすると共に、実行時のコマンドラインを、mainに渡せるように加工、編集してから、mainを呼び出します。 main関数では、コマンドラインを利用しないのなら int main(void) と書きます。 コマンドラインを利用するなら int main(int argc, char** argv) とか int main(int argc, char* argv[]) とか書きます。 コマンドラインとは、コマンドを実行する時に打ち込んだ C:\>dir *.txt や sh% ls *.txt などの文字列「dir *.txt」や「ls *.txt」の事です。 実は、コマンドラインを利用しない場合であっても int main(int argc, char** argv) と書いても構わないのですが、最近のCコンパイラは「お節介」なので、使ってない引数や変数があると「識別子○○○が使用されていません」とワーニングを出します。 このワーニングが出るとうざったいので、コマンドラインを利用しない場合は int main(void) のように「使わない引数は書かない」のです。 で、argcやargvには、コマンドプロンプトやシェルで打ち込んだ文字列が加工され「引数の個数」と「分解した引数の配列」が渡されて来ます。
お礼
回答ありがとうございます。
- redfox63
- ベストアンサー率71% (1325/1856)
前者は作成したアプリを実行する際に 引数をとらない場合の書式です 後者は引数をとる場合の書式になります たとえば foo.exe といった実行ファイルが作成されている場合 前者は foo.exe[Enter] で起動されることを前提にしています 後者は foo.exe 123456 abc[enter] などのように パラメータ(引数)を与えられるようにすることが出来ます argcは 引数の数をカウントしています argvは 引数そのものを文字列のポインタでmain関数に渡します # この書式だと厳密にはargvの型は文字へのポインタのポインタですが 上記の例では argcは3になり argv[0]="foo.exe", argv[1]="123456", argv[2]="abc"が格納されます 私は int main( int argc, char* argv[] ) の方が好きですけど ・・・ 宣言の意味的にはほぼ同じです
お礼
回答ありがとうございます。
本を使っての独習なのでしょうか? 私の場合(<技術・説明力不足のため)「関数」と「ポインタ」という用語を用いませんとうまく説明できる自信がない(C#ばっかり使っているので忘れてきた)ので、確認させていただきました。 本を使っての独習の場合は、たいてい後半のページに、関数、引数、ポインタなどが出てきます。 例えばBMI値を求める関数を自作したときに、 getBMI(double shincyou, double taijuu) とすると思いますが、main(int argc~~)とほとんど同じ意味です。 ちょっと概要だけの説明になってしまい、細かい点が違う、というような場合は、ご容赦願います。
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。