多くのC++ IDEやコンパイラでは、メイン関数を生成すると、次のようになります。
int main(int argc, char *argv[])
IDEなしでC++をコーディングするときに、コマンドラインコンパイラだけを使うと、次のように入力します。
int main()
パラメータなし。これはどういう意味ですか、それは私のプログラムにとって不可欠ですか?
argv
とargc
は、CおよびC++でコマンドライン引数をmain()
に渡す方法です。
argc
はargv
が指す文字列の数になります。事実上すべての実装はプログラム名を配列の前に付けるので、これは(実際には)1に引数の数を加えたものになります。
変数は慣例でargc
( argument count )とargv
( argument vector )と名付けられていますが、任意の有効な識別子を与えることができます。int main(int num_args, char** arg_strings)
も同様に有効です。
コマンドライン引数を処理するつもりがない場合は、それらを完全に省略してint main()
を生成することもできます。
次のプログラムを試してください。
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
./test a1 b2 c3
を付けて実行すると出力されます。
Have 4 arguments:
./test
a1
b2
c3
argc
はコマンドラインからプログラムに渡される引数の数、argv
は引数の配列です。
あなたは引数の数を知っている引数をループすることができます:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
このようにしてプログラムを実行するとします(sh
構文を使用)。
myprog arg1 arg2 'arg 3'
Mainをint main(int argc, char *argv[])
として宣言した場合、(ほとんどの環境で)、main()
は以下のように呼び出されます。
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
ただし、mainをint main()
と宣言した場合は、次のようになります。
exit(main());
引数が渡されません。
注意すべき2つの追加事項
main
に対する唯一の2つの標準的な強制署名です。特定のプラットフォームが追加の引数または異なる戻り型を受け入れる場合、それは拡張機能であり、移植性のあるプログラムでは信頼できません。*argv[]
と**argv
はまったく同じなので、int main(int argc, char *argv[])
をint main(int argc, char **argv)
と書くことができます。main
のパラメータは、プログラムの起動時にプログラムに提供されたコマンドラインパラメータを表します。 argc
パラメータはコマンドライン引数の数を表し、char *argv[]
はコマンドラインで提供される個々の引数を表す文字列(文字ポインタ)の配列です。
main
関数は、argc
とargv
の2つのパラメータを持つことができます。 argc
は整数(int
)パラメータであり、プログラムに渡される引数の数です。
プログラム名は常に最初の引数であるため、プログラムには少なくとも1つの引数があり、argc
の最小値は1になります。しかし、プログラムが2つの引数を持つ場合、argc
の値は3になります。
パラメータargv
は文字列配列を指し、 引数vector と呼ばれます。これは関数引数の1次元文字列配列です。
最初のパラメータは与えられた引数の数で、2番目のパラメータはそれらの引数を表す文字列のリストです。
int main();
これは単純な宣言です。コマンドライン引数を取ることはできません。
int main(int argc, char* argv[]);
この宣言は、プログラムがコマンドライン引数を取る必要があるときに使用されます。このように実行すると
myprogram arg1 arg2 arg3
argc
またはArgument Countは4(4つの引数)に設定され、argv
またはArgument Vectorsには "myprogram"、 "arg1"、 "arg2"、および "arg3"への文字列ポインタが移入されます。 プログラム呼び出し(myprogram
)が引数に含まれています。
代わりに、あなたは使用することができます:
int main(int argc, char** argv);
これも有効です。
追加できるパラメーターがもう1つあります。
int main (int argc, char *argv[], char *envp[])
envp
パラメータには環境変数も含まれています。各エントリは次の形式に従います。
VARIABLENAME=VariableValue
このような:
Shell=/bin/bash
環境変数リストはnullで終了します。
重要: system()
の呼び出しには、argv
またはenvp
の値を直接使用しないでください。悪意のあるユーザーが環境変数をコマンドラインコマンドに設定し、(潜在的に)大きな被害をもたらす可能性があるため、これは 巨大な セキュリティホールです。一般的に、system()
を使わないでください。ほとんどの場合、Cライブラリを介して実装されたより優れたソリューションがあります。
両方の
int main(int argc, char *argv[]);
int main();
cまたはC++プログラムのエントリポイントの法的な定義です。 Stroustrup:C++のスタイルとテクニックFAQ /あなたのメイン関数に対して可能な、あるいは合法的なバリエーションのいくつかを詳述します。