Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这种理论上的跨平台代码不会改变Windows上的环境变量?_C++_Windows_Visual Studio 2010_Boost_Boost Filesystem - Fatal编程技术网

C++ 为什么这种理论上的跨平台代码不会改变Windows上的环境变量?

C++ 为什么这种理论上的跨平台代码不会改变Windows上的环境变量?,c++,windows,visual-studio-2010,boost,boost-filesystem,C++,Windows,Visual Studio 2010,Boost,Boost Filesystem,所以我尝试下一个代码: #include <iostream> #include <cstring> #include <cstdlib> #include <sstream> #include <boost/filesystem/v3/path.hpp> #include <boost/filesystem/v3/operations.hpp> #ifdef WIN #include <Windows.h> #

所以我尝试下一个代码:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <boost/filesystem/v3/path.hpp>
#include <boost/filesystem/v3/operations.hpp>
#ifdef WIN
#include <Windows.h>
#endif

void setEnviromentVariable(std::string name, boost::filesystem::path value)
{
    if ( getenv (name.c_str())==NULL)
    {
        std::cout << "Hit ENTER to restart application in order to agree with the next terms of use: do not eat my bytes!)" << std::endl;
        std::stringstream VAR;
        VAR << name<< "=" << value.native().c_str();
           #ifdef WIN
        std::stringstream VAL;
        VAL << value.native().c_str();
        if( !SetEnvironmentVariable(TEXT(name.c_str()), TEXT(VAL.str().c_str()))) 
        {
            printf("SetEnvironmentVariable failed (%d)\n", GetLastError()); 
        }
          #else
        setenv(VAR.str().c_str());
          #endif
        std::cin.get();

    }

}
int main(int argc, char *argv[])
{
        boost::filesystem::path full_path( boost::filesystem::current_path() / "assets/" );
        setEnviromentVariable("TCL_LIBRARY", full_path);
}
#包括
#包括
#包括
#包括
#包括
#包括
#如果你赢了
#包括
#恩迪夫
void setEnvironmentVariable(std::string name,boost::filesystem::path value)
{
if(getenv(name.c_str())==NULL)
{
std::cout
putenv()
将指定的字符串指针放置在环境向量中;它不会复制字符串值

字符串指向的字符串成为环境的一部分。A
程序不应更改或释放字符串,也不应使用堆栈或
其他瞬态字符串变量作为
putenv()
的参数

因此,当
VAR
超出范围时,环境包含一个垃圾指针,尝试访问该指针将导致错误或返回垃圾。

putenv()
将指定的字符串指针放置在环境向量中;它不会复制字符串值

字符串指向的字符串成为环境的一部分。A
程序不应更改或释放字符串,也不应使用堆栈或
其他瞬态字符串变量作为
putenv()
的参数


<> P> >当代码> var >代码>超出范围时,环境包含垃圾指针,并尝试访问它,否则会导致垃圾或垃圾。

< P>除了GEKEOSAOR回答。如果您从shell运行程序,那么您可以从C++程序中编写一个字符串,如“导出TCLLaby=计算器值”。(取决于您使用的是什么shell)复制到某个文件,然后执行此文件

#!/bin/bash
your_program.exe
source generated_file_with_variable
next_program.exe

除了GeKeSoao回答。如果你从shell运行程序,那么你可以从C++程序中写一个字符串,比如“导出TCLSLoabl=CaligalTyValm”(取决于你使用的shell)到某个文件,然后执行这个文件。

#!/bin/bash
your_program.exe
source generated_file_with_variable
next_program.exe

您的进程有自己的环境副本,您的所有更改都会影响该副本。只有您启动的子进程才能看到您的修改,并且当您生成子进程时,它们会及时看到您的环境被冻结。启动您的程序将完全不受影响


因此,您关于重新启动应用程序的评论毫无意义。新实例将获得父进程环境的副本,而不是您一直在更改的环境。(Oth,如果您的程序启动了新副本,它将继承您更改的环境块。)

您的进程有自己的环境副本,您所做的所有更改都会影响该副本。只有您启动的子进程才能看到您的修改,当您生成子进程时,它们会及时冻结您的环境。启动您的程序将完全不受影响


因此,您关于重新启动应用程序的评论毫无意义。新实例将获得父进程环境的副本,而不是您一直在更改的环境。(哦,如果您的程序启动了新副本,它将继承您更改的环境块。)

通常会出现
setenv()
函数更灵活,并复制其参数。但我无法告诉您Windows上可能提供哪些函数,这就是为什么我没有像通常那样提供任何建议。
strdup
可以解决即时范围问题,但有一个更大的问题。通常会有一个
setenv()
函数更灵活,并复制其参数。不过,我无法告诉您Windows上可能提供哪些函数,这就是为什么我没有像通常那样提供任何建议的原因。
strdup
可以解决即时范围问题,但还有一个更大的问题。