Acceso a variables de entorno en C ++

Me gustaría tener acceso a la variable de entorno $HOME en un progtwig 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:

 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() para acceder a las variables de entorno en C ++? ¿Hay algún problema que pueda encontrar y que pueda evitar con un poco de conocimiento?

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 de std:: namespace (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 no está 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 GetEnvironmentVariable() Win32.

Me gustaría 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); } 
  • Si está en Windows, puede usar la GetEnlace API EnvironmentVariable de Win32 .
  • En otros sistemas basados ​​en Linux / Unix use getenv

Por qué usar GetEnvironmentVariable en Windows, desde MSDN getenv :

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

Y desde GetEnvironment de MSDN :

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

En c ++, debe usar std :: getenv y #include