web-dev-qa-db-fra.com

Accès aux variables d'environnement en C ++

Je voudrais avoir accès à la variable d'environnement $HOME Dans un programme C++ que j'écris. Si j'écrivais du code en C, j'utiliserais simplement la fonction getenv(), mais je me demandais s'il y avait une meilleure façon de le faire. Voici le code que j'ai jusqu'à présent:

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;                                                                        
}           

Dois-je utiliser getenv() pour accéder aux variables d'environnement en C++? Y a-t-il des problèmes que je suis susceptible de rencontrer et que je peux éviter avec un peu de connaissances?

63
James Thompson

Il n'y a rien de mal à utiliser getenv() en C++. Il est défini par stdlib.h, Ou si vous préférez l'implémentation de bibliothèque standard, vous pouvez inclure cstdlib et accéder à la fonction via l'espace de noms std:: (C'est-à-dire std::getenv()). Absolument rien de mal à cela. En fait, si vous êtes préoccupé par la portabilité, l'une de ces deux versions est préférée.

Si vous n'êtes pas préoccupé par la portabilité et que vous utilisez le C++ managé, vous pouvez utiliser l'équivalent .NET - System::Environment::GetEnvironmentVariable() . Si vous voulez l'équivalent non .NET pour Windows, vous pouvez simplement utiliser la fonction GetEnvironmentVariable() Win32.

60
Matt Davis

Je voudrais juste refactoriser un peu le code:

std::string getEnvVar( std::string const & key ) const
{
    char * val = getenv( key.c_str() );
    return val == NULL ? std::string("") : std::string(val);
}
24
Vlad
  • Si vous êtes sous Windows, vous pouvez utiliser l'API Win32 GetEnvironmentVariable
  • Sur d'autres systèmes basés sur Linux/Unix, utilisez getenv

Pourquoi utiliser GetEnvironmentVariable dans Windows, à partir de MSDN getenv :

getenv fonctionne uniquement sur les structures de données accessibles à la bibliothèque d'exécution et non sur le "segment" d'environnement créé pour le processus par le système d'exploitation. Par conséquent, les programmes qui utilisent l'argument envp pour main ou wmain peuvent récupérer des informations non valides.

Et de MSDN GetEnvironment :

Cette fonction peut récupérer une variable d'environnement système ou une variable d'environnement utilisateur.

17
Brian R. Bondy

En c ++, vous devez utiliser std :: getenv et #include <cstdlib>

10
Mykola Golubyev