2009-03-10 15 views
56

Me gustaría tener acceso a la variable de entorno $HOME en un programa C++ que estoy escribiendo. Si estuviera escribiendo código en C, solo usaría la función getenv(), pero me preguntaba si habría una mejor manera de hacerlo. Aquí está el código que tengo hasta ahora:Acceso a variables de entorno En C++

std::string get_env_var(std::string const & key) {         
    char * val;                   
    val = getenv(key.c_str());              
    std::string retval = "";               
    if (val != NULL) {                 
     retval = val;                  
    }                     
    return retval;                   
}   

¿Debo usar getenv() acceder a las variables de entorno en C++? ¿Hay algún problema que pueda encontrar y que pueda evitar con un poco de conocimiento?

+0

Creo que quería decir para volver retval. – Ferruccio

+0

Aparte del error que señaló Ferruccio, esto me parece correcto. – grieve

Respuesta

54

No hay nada de malo con el uso de getenv() en C++. Está definido por stdlib.h, o si prefiere la implementación de la biblioteca estándar, puede incluir cstdlib y acceder a la función a través del espacio de nombres std:: (es decir, std::getenv()). Absolutamente nada de malo en esto. De hecho, si le preocupa la portabilidad, se prefiere cualquiera de estas dos versiones.

Si usted es no preocupado por la portabilidad y está utilizando C++ administrado, puede usar el equivalente .NET - System::Environment::GetEnvironmentVariable(). Si desea el equivalente no-.NET para Windows, simplemente puede usar la función Win32 de GetEnvironmentVariable().

+0

Me atrevo a notar que std :: getenv() en realidad no se encuentra en el espacio de nombres estándar, sino en el espacio de nombres predeterminado (nulo). – Tebe

+9

@shbk, hay una función getenv() definida en que está en el espacio de nombres global, que es al que se refiere. También hay una función getenv() definida en que se encuentra en el espacio de nombres estándar. –

+0

En realidad, [esta respuesta] (http://stackoverflow.com/a/631717/1889329) sugiere que 'getenv()' no se debe usar. – IInspectable

10

en C++ tiene que usar std :: getenv y #include <cstdlib>

14

qué utilizar GetEnvironmentVariable en Windows, from MSDN getenv:

getenv funciona solo en las estructuras de datos accesibles para la biblioteca en tiempo de ejecución y no en el entorno "segmento" creado para el proceso por sistema operativo. Por lo tanto, los programas que usan el argumento envp al main o wmain pueden recuperar información inválida de .

Y from MSDN GetEnvironment:

Esta función puede recuperar ya sea una variable de entorno sistema o una variable de entorno de usuario .

+2

Es un comentario curioso sobre getenv() de MSDN. ¿Alguna idea de lo que realmente significa (es decir, qué y cuándo pueden ser estas diferencias)? –

+0

No sé exactamente, pero recomendaría utilizar GetEnvironmentVariable en Windows. Siempre es mejor usar la API Win32. –

+4

Esto significa que las variables de entorno establecidas mediante SetEnvironmentVariable no son accesibles a genenv una vez que el proceso ha comenzado. – Bob9630

18

me acaba de refactorizar el código un poco:

std::string getEnvVar(std::string const & key) const 
{ 
    char * val = getenv(key.c_str()); 
    return val == NULL ? std::string("") : std::string(val); 
} 
+0

Impresionante solución. Simple y conciso! – dustinrwh

Cuestiones relacionadas