FC2ブログ
にほんブログ村 IT技術ブログへ
にほんブログ村
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
C の main() のプロトタイプ宣言といえば、同じみですね。

int main(int argc, char *argv[]);


argc はコマンドラインで指定されたコマンド自身も含めた引数の数、argv はそれぞれの引数文字列のアドレスを格納した配列です。
じつは、C の main() には、三つ目の引数があるのをご存知でしょうか。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[], char *arge[])
{
    while (*arge++) {
        printf("%s\n", *arge);
    }
   
    return EXIT_SUCCESS;
}


引数 arge には何が入るかというと、環境変数の文字列のアドレスが渡されます。このプログラムを実行すると、以下のような感じになります。

・実行結果(抜粋)

CVS_RSH=/bin/ssh
LANG=C.UTF-8
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
PROGRAMFILES=C:\Program Files
PROMPT=$P$G
SESSIONNAME=Console
SHLVL=1
TERM=cygwin
WINDIR=C:\Windows
_=./hack2.exe


つまり、引数 arge を使って環境変数を取得できるようになります。
しかし、 getenv(3) を使っても同じように環境変数を取得できます。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("CVS_RSH=%s\n", getenv("CVS_RSH"));
    printf("LANG=%s\n", getenv("LANG"));
    printf("NUMBER_OF_PROCESSORS=%s\n",
             getenv("NUMBER_OF_PROCESSORS"));
    printf("OS=%s\n", getenv("OS"));
    printf("PROGRAMFILES=%s\n", getenv("PROGRAMFILES"));
    printf("PROMPT=%s\n", getenv("PROMPT"));
    printf("SESSIONNAME=%s\n", getenv("SESSIONNAME"));
    printf("SHLVL=%s\n", getenv("SHLVL"));
    printf("TERM=%s\n", getenv("TERM"));
    printf("WINDIR=%s\n", getenv("WINDIR"));
    printf("_=%s\n", getenv("_"));
   
    return EXIT_SUCCESS;
}


・実行結果

CVS_RSH=/bin/ssh
LANG=C.UTF-8
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
PROGRAMFILES=C:\Program Files
PROMPT=$P$G
SESSIONNAME=Console
SHLVL=1
TERM=cygwin
WINDIR=C:\Windows
_=./hack3.exe


環境変数の値を取得するだけであれば、getenv(3) を使えば欲しい環境変数名を指定して取得できるので使いやすいです。指定した環境変数が存在しない場合は、NULL が返却されます。

で、この引数 arge ですが、どういうときに使うかというと・・・、じつは、使うことはほとんどありません。上記で説明したように、getenv(3) で環境変数を取得できるからです。それに引数 arge のほうは、環境変数文字列のアドレスを含んだ配列が丸ごと全部渡されるので、ループして欲しい環境変数を探す必要があります。しかも、文字列は name=value の形式で渡されるため、値(value)の部分のみ取り出さないといけないので、使いづらさこの上ないです。そんなわけで、引数 arge の使い道はほとんどないわけです。

これは僕の勝手な想像ですが、おそらく getenv(3) が作られる以前では、この引数 arge を使って環境変数を取得していたのではないか、と思います。あくまで、想像です。

今回はトリビア的なお話でした。


スポンサーサイト
Secret

TrackBackURL
→http://tsurujiro.blog.fc2.com/tb.php/28-83883483
/* 引用 */ blockquote { padding: 0.3em 0.3em 0.3em 0.5em; width: 80%; border-left: 5px solid #4a0400; background-color: #AFEEEE; font-size: 0.875em; overflow: auto; } blockquote pre, blockquote pre code { margin: 0; overflow: auto; }
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。