Установите локальные переменные среды в C++

Как установить переменную среды в C++?

  • Им не нужно сохранять прошлое выполнение программы
  • Они должны быть видны только в текущем процессе
  • Предпочтение не зависит от платформы, но для моей проблемы нужно работать только на Win32/64.

Спасибо


person Jesse Vogt    schedule 22.05.2009    source источник


Ответы (4)


NAME

       putenv - change or add an environment variable

SYNOPSIS

       #include <stdlib.h>

       int putenv(char *string);

DESCRIPTION
       The  putenv()  function adds or changes the value of environment
       variables.  The argument string is of the form name=value.  If name does
       not already exist in the environment, then string is added  to  the
       environment.   If name does exist, then the value of name in the
       environment is changed to value.  The string pointed to by string becomes
       part of the environment, so altering the string changes the environment.

Насколько я знаю, в Win32 это называется _putenv.

См. также SetEnvironmentVariable, если вы любите длинные и некрасивые имена функций. .

person alamar    schedule 22.05.2009
comment
Примечание для спрашивающего - putenv также поддерживается в Win32. - person ; 22.05.2009
comment
Можем ли мы использовать правильные имена заголовков C++? ‹cstdlib› подходит (да, я знаю... это мой зависание). - person Harper Shelby; 22.05.2009
comment
Это C, как задумал Господь Бог. - person alamar; 22.05.2009
comment
stlib.h - это правильный заголовочный файл C - вопрос помечен как C - person ; 22.05.2009
comment
Вы уверены, что изменение не является глобальным в Windows? - person Bastien Léonard; 22.05.2009
comment
Задает содержимое указанной переменной среды для текущего процесса. - person alamar; 23.05.2009
comment
MSDN явно указывает, что _putenv() применяется только к текущему процессу. По-видимому, это также относится только к среде, видимой для библиотеки времени выполнения C, но функции CRT, создающие новые процессы, предоставляют среду CRT для нового процесса, поэтому вы обычно этого не замечаете. SetEnvironmentVariable() манипулирует фактической таблицей среды процесса. Я не знаю, имеет ли это различие значение на практике. Чтобы внести глобальные изменения среды, вам нужно коснуться реестра, так что это гораздо сложнее сделать случайно. - person RBerteig; 23.05.2009
comment
Кстати, putenv() нет в стандартной библиотеке C. Он определяется POSIX. Вот почему версия Microsoft начинается с символа подчеркивания (если вы не используете #define, который включает функции POSIX, и в этом случае oldnames.lib перенаправляет для вас putenv() → _putenv()). - person bk1e; 25.05.2009
comment
SetEnvironmentVariable, конечно, не уродливое имя функции; это гораздо более наглядно, чем putenv. - person Valentein; 16.11.2011
comment
Примечание: setenv отличается от putenv тем, что он делает копию строки вместо того, чтобы заставлять пользователя следить за тем, чтобы она оставалась активной столько, сколько необходимо. - person Mr Fooz; 25.02.2013
comment
@RBerteig, вы написали, что не знаете, имеет ли значение на практике тот факт, что SetEnvironmentVariable, в отличие от_putenv(), манипулирует фактической переменной среды процесса. Я написал код, в котором увидел, что добавление каталога в PATH с использованием _putenv() работает, а использование SetEnvironmentVariable — нет. Так что, видимо, это может иметь значение. - person Alan; 02.10.2017
comment
К сожалению, putenv кажется неправильным, поэтому не будет работать с const char *. setenv однако есть и будет. - person Catskul; 06.03.2019

Я не уверен, что вам нужны переменные среды, поскольку они не будут использоваться вне этого запуска программы. Не нужно задействовать ОС.

Возможно, вам лучше иметь одноэлементный класс или пространство имен, которое содержит все эти значения, и инициализировать их при запуске программы.

person JohnMcG    schedule 22.05.2009
comment
Они будут видны только дочерним процессам, а putenv() обычно вообще не нужно общаться с ОС. - person RBerteig; 23.05.2009

Также есть setenv, который немного более гибкий, чем putenv, в котором setenv проверяет, установлена ​​ли уже переменная среды, и не перезапишет ее, если вы установите аргумент «перезаписать», указывающий, что вы не хотите его перезаписывать. , а также тем, что имя и значение являются отдельными аргументами для setenv:

NAME
        setenv - change or add an environment variable
SYNOPSIS
       #include <stdlib.h>

       int setenv(const char *name, const char *value, int overwrite);

       int unsetenv(const char *name);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       setenv(), unsetenv():
           _POSIX_C_SOURCE >= 200112L
               || /* Glibc versions <= 2.19: */ _BSD_SOURCE
DESCRIPTION
       The setenv() function adds the variable name to the environment with
       the value value, if name does not already exist.  If name does exist
       in the environment, then its value is changed to value if overwrite
       is nonzero; if overwrite is zero, then the value of name is not
       changed (and setenv() returns a success status).  This function makes
       copies of the strings pointed to by name and value (by contrast with
       putenv(3)).

       The unsetenv() function deletes the variable name from the
       environment.  If name does not exist in the environment, then the
       function succeeds, and the environment is unchanged.

Я не говорю, что лучше или хуже другого; это просто зависит от вашего приложения.

См. http://man7.org/linux/man-pages/man3/setenv.3.html

person MarkR    schedule 14.05.2020
comment
Это более практично, так как позволяет избежать использования «неконстантного» символа * в качестве параметра. - person 8znr; 28.01.2021

person    schedule
comment
Я ожидаю, что ответ будет состоять из (1) включаемого файла и (2) одной строки кода. И, возможно, библиотека, с которой я должен связаться. - person notlesh; 30.04.2014
comment
Нотлеш, почему? Также есть инструкции по компиляции. Зачем добавлять больше файлов? Я не понимаю, почему за это проголосовали. - person Owl; 25.05.2017
comment
Хорошей практикой в ​​Stack Overflow является добавление объяснения того, почему ваше решение должно работать. Для получения дополнительной информации прочитайте Как ответить. - person Samuel Liew♦; 12.04.2018