Я посмотрел в Стивенс и в Руководстве программиста Posix , и лучшее, что я могу найти, это
Массив строк, называемый enviroment , становится доступным, когда начинается процесс.
На этот массив указывает внешняя переменная environ
, которая определяется как:
extern char **environ;
Это та переменная окружающая среда , которая заставляет меня колебаться. Я хочу сказать
- Вызывающий процесс / оболочка уже выделил блок строк с нулевым символом в конце
- переменная 'external' environ
используется в качестве точки входа для getenv () .
- ipso facto не стесняйтесь вызывать getenv () в статическом инициализаторе.
Но я не могу найти никаких гарантий, что «статическая инициализация» environment предшествует всему другому статическому коду инициализации. Я обдумываю это?
Обновление
На моей платформе (AMD Opteron, Redhat 4, GCC 3.2.3), настройка LD_DEBUG показывает, что environment устанавливается до мои статические инициализаторы называются. Это приятно знать; спасибо, @codelogic. Но это не обязательно результат, который я получу на всех платформах.
Кроме того, хотя я интуитивно согласен с @ChrisW относительно поведения библиотеки времени выполнения C / C ++, это всего лишь моя интуиция, основанная на опыте. Таким образом, любой, кто может получить цитату из какого-нибудь авторитетного источника, гарантирующего, что environment есть до вызова статических инициализаторов, бонусные баллы!