C++:Setenv()。在Visual Studio中未定义的标识符。

21

看起来我的代码是正确的,根据我能在网上找到的所有文档。我的IDE是MS Visual Studio Xpress 4 Windows Desktop 2012,但它的编译器出现了以下错误:

Error 1 error C3861: 'setenv':未找到标识符e:\users\owner\documents\visual studio 2012\projects\project1\project1\source1.cpp 18 1 Project1

帮帮我!!!

#include <windows.h>
#include <sstream>
#include <ostream>
#include <cstdlib>
#include <iostream>
#include <stdlib.h>

using namespace std;

int howManyInClass = 0;
int main(){

long checklength = sizeof(getenv("classSize"))/sizeof(*getenv("classSize"));
if (checklength==0){
    cout<<"Please enter the ammount of students in your class";
    cin>> howManyInClass;
    cin.ignore();
    setenv("classSize", howManyInClass, 1);}

};

等等,我不应该需要2,因为我已经使用了std作为命名空间。 - MWP
4个回答

35

微软的运行库不支持标准的setenv()函数。你可以使用它们的替代品_putenv(),或者为了可移植性,我更喜欢使用一个简单的包装器。

这是我的包装器与标准接口:

int setenv(const char *name, const char *value, int overwrite)
{
    int errcode = 0;
    if(!overwrite) {
        size_t envsize = 0;
        errcode = getenv_s(&envsize, NULL, 0, name);
        if(errcode || envsize) return errcode;
    }
    return _putenv_s(name, value);
}

我在Windows上尝试了来自processenv.h的SetEnvironmentVariable(name, value),但我确信它有缺陷。由于某种原因,LoadLibrary() API无法看到由SetEnvironmentVariable()修改的PATH。对于我的情况,_putenv_s()运行良好。 - Alexander Samoylov

16

你可以使用_putenv(),该函数需要将字符串参数设置为classSize=7

ostringstream classSize;
classSize << "classSize=" << howManyInClass;
_putenv(classSize.str().c_str());

...或者更好的安全增强版_putenv_s(),它将键和值作为单独的(const char*)参数传递;

ostringstream classSize;
classSize << howManyInClass;
_putenv_s("classSize", classSize.str().c_str());

你能帮我解决这个错误吗:'Error 1 error C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. e:\users\owner\documents\visual studio 2012\projects\project1\project1\source1.cpp 12 1 SchoolManagementSystme' 谢谢。 - MWP
_putenv() _putenv_s 链接似乎失效了。 - chux - Reinstate Monica

1

这是更安全的解决方案,但请记住,它仅支持VS2005之后的版本。 - fliedonion

0

你遇到链接错误的原因是,如果你查看stdlib.h库的内容,你会发现setenv()没有在那里声明。乍一看,它是一个C标准API,但似乎Windows并没有遵循所有的标准。或者,你可以配置你的VS使用CRT而不是Windows运行时,在这种情况下,我认为setenv将被识别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接