と思われるargv[argc]
常にあるNULL
ので、私たちはせずに引数リストを横切ることができると思いますargc
。単一のwhile
ループがこれを行います。
NULL
の最後に常にaがある場合argv
、なぜ必要なのargc
ですか?
"\0"
は、NULLポインタと同じではありません(0
C ++ではNULLと同等です)
と思われるargv[argc]
常にあるNULL
ので、私たちはせずに引数リストを横切ることができると思いますargc
。単一のwhile
ループがこれを行います。
NULL
の最後に常にaがある場合argv
、なぜ必要なのargc
ですか?
"\0"
は、NULLポインタと同じではありません(0
C ++ではNULLと同等です)
回答:
はい、argv[argc]==NULL
保証されています。C11 5.1.2.2.1プログラムの起動を参照(私の強調)
それらが宣言されている場合、メイン関数のパラメーターは次の制約に従います。
argcの値は負ではありません。 argv [argc]はnullポインターです。
argc
したがって、提供することは重要ではありませんが、それでも役立ちます。特に、正しい数の引数が渡されたことをすばやく確認できます。
編集:質問がC ++を含むように修正されました。n3337ドラフト3.6.1メイン関数は言う
2 ... argcは、プログラムが実行される環境からプログラムに渡される引数の数です。.... argcの値は負でない必要があります。argv [argc]の値は0です。
argc
シェル拡張を行っているので、(そうで、非常に大きな可能性が前にシェルによって展開されるの実行可能)。私のシステムでは、数十万のシステムを使用できます。ls *
*
execve
/bin/ls
argc
argc
十分であると考えていたので、これは私には決して起こりませんでしたが、私はこの保証が関連し、さらには必要とされる状況を確実に考えることができます。+1
argc
ます。
はい、argv[argc]
nullポインタであることが保証されています。argc
便宜上使用されます。
C99 Rationaleからの公式説明を引用して、冗長チェックという言葉に注意してください。
国際標準の根拠—プログラミング言語— C§5.1.2.2.1 プログラムの起動
の仕様
argc
およびそのargv
ための引数として、main
広範囲にわたる従来の慣行を認識しています。argv[argc]
これも一般的な慣行に基づいて、リストの最後の冗長チェックを提供するには、ヌルポインターである必要があります。
さまざまな規格で要求されているため、「必要」です。
値は完全に無視できますが、これはの最初のパラメーターであるmain
ため、パラメーターリストに含める必要があります。C ++(およびおそらく非標準のC方言)では、次のC ++スニペット(Cへの変換が簡単)のように、パラメーター名を省略できます。
#include <stdio.h> // C-compatible include, guarantees puts in global namespace
// program will print contents of argv, one item per line, starting from argv[0]
int main(int /*argc*/, char *argv[]) { // uncomment argc for C
//(void)argc; // uncomment statement for C
for (int i=0; argv[i]; ++i) {
puts(argv[i]);
}
return 0;
}
標準Cでは、一般的な警告設定で、未使用のパラメーターが警告(void)argc;
を生成します。これは、コードを生成せずに名前が使用されるようにするステートメントによって修正できます。
argc
それ以外の場合、多くのプログラムは、カウントを取得するためにパラメータを徹底的に調査する必要があるためです。また、長さのある配列を持つ多くのプログラミング言語では、argc
パラメーターはなく、項目を持つ配列しかありません。
int argc(char *argv[])