我查看了Stevens和Posix Programmer's Guide,我能找到的最好的是
当进程开始时,一个称为环境的字符串数组可用。该数组由外部变量 指向,
environ
定义为:
extern char **environ;
正是那个环境变量让我犹豫不决。我想说
- 调用进程/shell 已经分配了空终止字符串块
- 'external' 变量被getenv()environ
用作入口点。
- ipso facto可以随意在静态初始化程序中调用getenv() 。
但是我找不到任何保证environ的“静态初始化”在所有其他静态初始化代码之前。这是我想太多了吗?
更新
在我的平台(AMD Opteron、Redhat 4、GCC 3.2.3)上,设置LD_DEBUG表明在调用我的静态初始化程序之前设置了environ 。这是一件好事。谢谢,@codelogic。但这不一定是我在所有平台上都能得到的结果。
此外,虽然我直观地同意@ChrisW 关于 C/C++ 运行时库的行为,但这只是我基于经验的直觉。因此,任何可以从某个权威的地方引用来保证环境在调用静态初始化程序之前就在那里的人,加分!