С++: 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);}

};

person MWP    schedule 23.06.2013    source источник
comment
Подождите, мне не нужно 2, так как я уже использовал std в качестве пространства имен.   -  person MWP    schedule 23.06.2013


Ответы (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());
person Joachim Isaksson    schedule 23.06.2013
comment
Не могли бы вы помочь мне с ошибкой: «Ошибка 1, ошибка C4996:« getenv »: эта функция или переменная могут быть небезопасными. Вместо этого рассмотрите возможность использования _dupenv_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS. Смотрите справку для деталей. e:\users\owner\documents\visual studio 2012\projects\project1\project1\source1.cpp 12 1 SchoolManagementSystme' Спасибо - person MWP; 23.06.2013
comment
_putenv() _putenv_s ссылки не работают. - person chux - Reinstate Monica; 20.06.2017

Библиотека времени выполнения 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);
}
person Bill Weinman    schedule 12.05.2014
comment
Я пробовал также SetEnvironmentVariable(name, value) из processenv.h в Windows, но убедился, что это глючит. API LoadLibrary() по какой-то причине не видит PATH, измененный SetEnvironmentVariable(). _putenv_s() отлично работал в моем случае. - person Alexander Samoylov; 27.08.2020

Попробуйте _putenv вместо setenv.

msdn_putenv

person flied onion    schedule 23.06.2013
comment
Это лучшее решение для защиты, но имейте в виду, что поддержка будет только после VS2005. - person flied onion; 23.06.2013

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

person user3769509    schedule 02.12.2014