简体   繁体   English

在 C++ 中设置本地环境变量

[英]Set local environment variables in C++

How do I set an environment variable in C++?如何在 C++ 中设置环境变量?

  • They do not need to persist past program execution他们不需要坚持过去的程序执行
  • They only need to be visible in the current process它们只需要在当前进程中可见
  • Preference for platform independent but for my problem only needs to work on Win32/64偏好独立于平台但我的问题只需要在 Win32/64 上工作

Thanks谢谢

NAME

       putenv - change or add an environment variable

SYNOPSIS

       #include &ltstdlib.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.

On Win32 it's called _putenv I believe.在 Win32 上,我相信它被称为 _putenv。

See SetEnvironmentVariable also if you're a fan of long and ugly function names.如果您喜欢又长又丑的函数名,请参阅SetEnvironmentVariable

There's also setenv , which is slightly more flexible than putenv , in that setenv checks to see whether the environment variable is already set and won't overwrite it, if you set the "overwrite" argument indicating that you don't want to overwrite it, and also in that the name and value are separate arguments to setenv :还有setenv ,它比putenv稍微灵活一点,因为setenv检查环境变量是否已经设置并且不会覆盖它,如果你设置了“overwrite”参数表明你不想覆盖它,而且名称和值是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.

I'm not saying either is better or worse than the other;我并不是说其中一个比另一个更好或更差; it just depends on your application.这仅取决于您的应用程序。

See http://man7.org/linux/man-pages/man3/setenv.3.htmlhttp://man7.org/linux/man-pages/man3/setenv.3.html

I'm not positive environment variables are what you need, since they aren't going to be used outside of this run of the program.我不是肯定的环境变量是你所需要的,因为它们不会在程序运行之外使用。 No need to engage the OS.无需使用操作系统。

You might be better off having a singleton class or a namespace that holds all these values, and initialize them when you start the program.您最好拥有一个单例类或一个包含所有这些值的命名空间,并在您启动程序时对其进行初始化。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{

    char *var, *value;
    if (argc == 1 || argc > 3) {
        fprintf(stderr, "usage:environ variables \n");
        exit(0);
    }
    var = argv[1];
    value = getenv(var);
    //---------------------------------------
    if (value) {
        printf("variable %s has value %s \n", var, value);
    }
    else
        printf("variable %s has no value \n", var);
    //----------------------------------------
    if (argc == 3) {
        char* string;
        value = argv[2];
        string = malloc(strlen(var) + strlen(value) + 2);
        if (!string) {
            fprintf(stderr, "out of memory \n");
            exit(1);
        }
        strcpy(string, var);
        strcat(string, "=");
        strcat(string, value);
        printf("calling putenv with: %s \n", string);
        if (putenv(string) != 0) {
            fprintf(stderr, "putenv failed\n");
            free(string);
            exit(1);
        }
        value = getenv(var);
        if (value)
            printf("New value of %s is %s \n", var, value);
        else
            printf("New value of %s is null??\n", var);
    }
    exit(0);

} //----main
# commands to execure on linux   
# compile:
$ gcc -o myfile myfile.c

# run:
$./myfile xyz
$./myfile abc
$./myfile pqr

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM