C
プログラムで環境変数を取得するには、次を使用できます。
getenv()
extern char **environ;
_しかし、上記以外に、main()
の3番目の引数として_char *envp[]
_を使用して、標準の一部と見なされる環境変数を取得していますか?
_#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%s\n",*envp++);
}
_
_char *envp[]
_は移植可能ですか?
関数getenv
は、C標準で指定されている唯一のものです。関数 putenv
およびextern environ
はPOSIX固有です。
main
パラメーターenvp
はPOSIXでは指定されていませんが、広くサポートされています。
環境リストにアクセスする別の方法は、main()関数の3番目の引数を宣言することです。
int main(int argc, char *argv[], char *envp[])
この引数は、environと同じ方法で処理できますが、そのスコープはmain()に対してローカルです。この機能はUNIXシステムで広く実装されていますが、スコープの制限に加えて、SUSv3で指定されていないため、使用を避ける必要があります。
ポータブルではありません。 *envp[]
は伝統的なUNIXのものであり、現代のすべてのUNIXシステムがそれを実装しているわけではありません。
また、サイドノートとして、*argv[]
を越えてポインタートラバーサルを実行してenvpにアクセスすることもできますが、それを考慮することはできませんsafeプログラミング。プロセスのメモリマップを見ると、envp[]
がargv[]
のすぐ上にあることがわかります。
この規格では、main
の2つの形式について説明しています( C99標準(pdf) の5.1.2.2.1を参照)
a)int main(void)
そして
b)int main(int argc, char **argv)
または同等のもの
また、実装で他の形式を定義できます(3番目の引数を許可できます)。
c)または他の実装定義の方法で。