main()
C または C++ アプリケーションで引数を渡す場合、argv[0]
常に実行可能ファイルの名前になりますか? それとも、これは一般的な規則であり、常に 100% 当てはまるとは限らないのでしょうか?
ベストアンサー1
推測(知識に基づいた推測であっても)は楽しいものですが、確実に知るためには標準文書を参照する必要があります。たとえば、ISO C11 には次のように記載されています(強調は筆者による)。
の値
argc
が0より大きい場合、argv[0]
を表すプログラム名。argv[0][0]
プログラム名がホスト環境から利用できない場合は、ヌル文字になります。
つまり、プログラム名だけが利用可能。そしてそれは「表す」プログラム名、必ずしもはプログラム名。その前のセクションには次のように記載されています。
の値
argc
が 0 より大きい場合、配列メンバーargv[0]
から までにargv[argc-1]
は、プログラムの起動前にホスト環境によって実装定義の値が与えられる文字列へのポインタが含まれます。
これは以前の標準であるC99から変更されておらず、価値観標準によって規定されるものではなく、完全に実装次第です。
これは、ホスト環境がしないホスト環境がする「その他」が何らかの形でプログラム名を表すという条件で、それを提供します。よりサディスティックな瞬間には、それをスワヒリ語に翻訳し、置換暗号に通してから逆バイト順で保存することを検討します :-)。
しかし、実装定義するISO 標準では特定の意味を持ちます。実装では、その動作を文書化する必要があります。したがって、任意のものを呼び出しファミリargv[0]
に含めることができる UNIX であってもexec
、それを文書化する必要があります (実際に文書化しています)。