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