1. ホーム
  2. c++

[解決済み] argv[0] = name-of-executable" は標準なのでしょうか、それとも単なる慣習なのでしょうか?

2022-03-13 04:28:54

質問

に引数を渡すと main() は、CまたはC++アプリケーションで argv[0] は常に実行ファイルの名前になるのでしょうか? それとも、これは一般的な慣習であって、100%そうであるとは保証されないのでしょうか?

解決方法は?

当てずっぽうの推測も楽しいものですが、念のために規格書を見ておく必要があります。例えば、ISO C11には次のように書かれています(私の強調)。

<ブロッククオート

の値が argc が0より大きい場合、その文字列は argv[0] を表します。 番組名です。 argv[0][0] は、ホスト環境からプログラム名を入手できない場合、ヌル文字とする。

だからダメなんです、あくまでプログラム名が が利用できます。 そしてそれは "represent"。 プログラム名であり、必ずしも プログラム名です。その前の項には、次のように書かれています。

の値が argc が0より大きい場合、配列のメンバ argv[0] を通して argv[argc-1] は,プログラム起動前にホスト環境から実装定義値として与えられる文字列へのポインタを含む。

これは、従来の規格であるC99から変更されていないものであり、たとえ は規格で決められているわけではなく、完全に実装次第なのです。

つまり、ホスト環境であれば、プログラム名を空にすることができます。 はしない。 を提供し、ホスト環境が する ただし、quot;anything else"が何らかの形でプログラム名を表していることが条件です。もっとサディスティックなことを言えば、スワヒリ語に翻訳して、それを置換暗号にかけ、逆バイトオーダーで保存することも考えています :-)。

しかし、実装で定義された が行います。 つまり、実装はそれがどのように動作するかを文書化しなければならないのです。つまり、UNIXでさえ、好きなものを argv[0] と共に exec は、それを文書化する必要があります(実際に文書化しています)。