C++: Setenv(). Неопределенный идентификатор в Visual Studio

Посмотрите, мой код кажется правильным, согласно всей документации, которую я могу найти онлайн. Моя IDE - MS Visual Studio Xpress 4 Windows Desktop 2012, и ее компилятор выдает ошибку:

Error 1 error C3861: 'setenv': identifier not found 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);}

};

4 ответа

Решение

Вы можете использовать _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());

Библиотека времени выполнения Microsoft не поддерживает стандарт 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);
}

Пытаться _putenv вместо setenv,

msdn _putenv

Причина, по которой вы столкнулись с ошибкой компоновки, заключается в том, что если вы посмотрите на содержимое библиотеки stdlib.h, вы обнаружите, что setenv() там не объявлен. На первый взгляд, это API-интерфейс стандарта C, но похоже, что Windows не соответствует всем стандартам. Или вы можете настроить VS для использования CRT вместо среды выполнения Windows, в этом случае, я думаю, setenv будет идентифицирован.

Другие вопросы по тегам