[迷信] argv[0] はプログラム名
main 関数が argc と argv の二つの仮引数を受け取る場合、argv[0] がプログラム名を表す文字列を指すというのは入門書にも載っています。しかし、常にそうかというと、「そうではない」としかいえなくなります。今回はフリースタンディング環境の話は除外して、ホスト環境の話に限って、この部分の事実関係がどうなっているかをご紹介します。
argv[0] がプログラム名にならないケースは、大きく分けて二つあります。ひとつは、そのそも main 関数にプログラム名が渡されないケースがある場合であり、もうひとつは、ユーザープログラムから main 関数を呼び出した場合です。
まずは、そもそも main 関数にプログラム名が渡されないケースについて見ていきます。JIS X3010:2003 の 5.1.2.2.1 プログラム開始処理から引用すると...
二つの仮引数を定義する場合,関数 main の仮引数は,次の制約に従わなければならない。
- argc の値は,非負でなければならない。
- argv[argc]は,空ポインタでなければならない。
(中略)
- argc の値が正の場合,argv[0] が指す文字列は,プログラム名(program name)を表す。ホスト環境からプログラム名を得ることができない場合,argv[0][0] は,ナル文字でなければならない。
上記は C の規格ですが、C++ の規格である JIS X3014:2003 でも(表現は違いますが)同等のことが規定されています。これからも分かるように,argc が 0 の場合には argv[0](すなわち argv[argc])は空ポインタ(=NULL)でなければなりませんので,プログラム名ではないことになります。このような処理系は実在します。また,argc > 0 であっても,プログラム名が得られない場合は argv[0] が "" を指すことになります(このようになる具体的な処理系は知りませんが...)。
次に,ユーザープログラムから main 関数を呼び出す場合です。これは C だけで可能なことであって、C++ では main 関数を直接呼び出すことも、関数へのポインタを介して間接的に呼び出すこともできません。ですので、以下は C に限った話になります。
ユーザープログラムから main 関数を呼び出す場合、それこそ実引数にどんなものを渡すかはプログラムの作り方次第になります。argc に負の値を渡すことも、argv に空ポインタを渡すこともできてしまいます。ですので、argv[0] がプログラム名になるかどうかも、完全にユーザープログラムの作り方次第になるわけです。
トラックバック
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- [迷信] 'A'~'Z' の値は連続している
- [迷信] 0xe-0xe はゼロ
- [迷信] 1 バイトは 8 ビット
- [迷信] 2の累乗による割り算と右シフトは等価
- [迷信] FILE 型は構造体
- [迷信] abs は常に非負の値を返す
- [迷信] argv[0] はプログラム名
- [迷信] char 型は符号付き
- [迷信] double の出力書式は "%lf"
- [迷信] fflush で入力バッファをクリア
- [迷信] free でメモリを開放する
- [迷信] free に NULL を渡すとクラッシュする
- [迷信] gets は単純に fgets に置き換えられる
- [迷信] isalpha 関数の引数は char 型
- [迷信] new に失敗すると NULL が返る。
- [迷信] scanf ではバッファオーバーランを防げない
- [迷信] scanf でキーボードから入力
- [迷信] setjmp マクロの返却値は変数に代入できる
- [迷信] sizeof は定数式
- [迷信] void main(void)
- [迷信] とりあえず memset で初期化
- [迷信] アルゴリズム関数内で関数オブジェクトはコピーされない
- [迷信] オブジェクトの動的生成に失敗するとメモリリークする
- [迷信] コンストラクタから例外を送出してはならない
- [迷信] コンストラクタで自身をゼロクリア
- [迷信] コンパイラはプログラマの心を察してくれる
- [迷信] コンパイルエラーが出るのでアクセス指定子を修正
- [迷信] ソースコード中の即値を全廃せよ
- [迷信] ソースファイルの末尾に }
- [迷信] データ列のソートには qsort 関数を使うべし
- [迷信] プログラムは必ず main から始まる
- [迷信] 一重引用符の中には一文字しか書けない
- [迷信] 今どき int が 16 ビットの処理系なんて無い
- [迷信] 入力データ格納用配列のサイズは BUFSIZ
- [迷信] 割付けたメモリはプログラマが自分で解放しなければならない
- [迷信] 実数型とは浮動小数点型のことである
- [迷信] 引用符で囲んだヘッダ名はカレントディレクトリから探索する
- [迷信] 文字列から整数への変換には atoi
- [迷信] 構造体のタグ名は下線で始める
- [迷信] 構造体はクラスではない
- [迷信] 識別子に使える文字は英数字と下線のみ
- [迷信] 非局所オブジェクトは外部結合
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 車輪の再発明
- 過去の情報

