の署名は(または同等のもの、または) でmain
なければなりません。引数を処理して、独自のコード内でより便利なものにします。これは手早くずさんな例です (適切なエラー処理がないなど)。int main(int argc, char* argv[])
int main()
#include <iostream>
#include <cstdlib>
#include <vector>
int main(int argc, char * argv[])
{
std::vector<int> nums;
nums.reserve(argc-3);
int pos = 3;
// Read args into vector of ints
while (pos < argc)
{
nums.push_back(atoi(argv[pos]));
++pos;
}
// Print them
for (auto i : nums) std::cout << i << '\n';
}
ここに実行があります:
$ ./a.out path1 path2 1 2 3 5 4
1
2
3
5
4
明確でない場合に備えて:argc
プログラムの名前を含む、渡された引数の数が含まれています。だから$ ./a.out
argc=1
、のために$ ./a.out some list of args
argc=5
。
次に、各引数のテキストを含む-style 文字列 ( -terminated ) のargv
配列です。c
NUL
const char *
厳密に言えば、argv
配列は必要以上に 1 長く、最後のエントリは NULL ポインタであることが保証されていることに注意してください。
標準オタクの場合、適切な 2011 標準はありませんC++
。これは N3337 からのものです。
3.6.1 主な機能
...
2 実装は、main
関数を事前に定義してはなりません。この関数はオーバーロードされません。type の戻り値の型を持つ必要がありint
ますが、それ以外の場合、その型は実装定義です。すべての実装は、 の次の定義の両方を許可する必要がありますmain
。
int main() { /* ... */ }
と
int main(int argc, char* argv[]) { /* ... */ }
後者の形式argc
では、プログラムが実行される環境からプログラムに渡される引数の数になります。argc
がゼロでない場合、これらの引数は、ヌル終了マルチバイト文字列 (ntmbs) (17.5.2.1.4.2) の最初の文字へのポインターとしてargv[0]
スルーで提供され、使用される名前を表す ntmbs の最初の文字へのポインターになるものとします。プログラムまたは "" を呼び出します。の値は非負でなければなりません。の値はです。[ 注: さらに (オプションの) パラメーターを の後に追加することをお勧めします。—終わりのメモ]argv[argc-1]
argv[0]
argc
argv[argc]
0
argv