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::coutputenv()
将指定的字符串指针放置在环境向量中;它不会复制字符串值
字符串指向的字符串成为环境的一部分。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
可以解决即时范围问题,但还有一个更大的问题。