Domanda

Per un'applicazione che utilizza una serie di variabili d'ambiente, c'è una sorta di convenzione o di "best practice" quando si tratta di afferrare le variabili d'ambiente e la loro messa in o una struttura o un gruppo di const di? Ovviamente, voglio fallback su un valore predefinito per ogni variabile di ambiente. In questo momento, utilizzando la seguente sembra un modo molto disordinato di farlo:

char* x;
const SOME_VARIABLE;
if (NULL == (x = getenv("SOME_VARIABLE")))
    SOME_VARIABLE = 5; // default value
else
    SOME_VARIABLE = x;

I potrebbe anche scrivere una funzione che avvolge getenv per restituire un valore predefinito se una variabile d'ambiente è vuoto, ma non sono sicuro se questo è anche il modo migliore per farlo. Potrei anche farla finita con l'utilizzo di const, ma questo non sembrare una buona cosa da fare, sia.

Qualche idea?

È stato utile?

Soluzione

Come su:

std::string GetEnvironmentVariableOrDefault(const std::string& variable_name, 
                                            const std::string& default_value)
{
    const char* value = getenv(variable_name.c_str());
    return value ? value : default_value;
}

Usato come:

const std::string some_variable = GetEnvironmentVariableOrDefault("SOME_VARIABLE", "5");

Altri suggerimenti

James McNellis ha fornito una grande risposta , ma qui è un parere alternativo:

Credo getenv() restituisce il valore della variabile di ambiente al momento è stato avviato il programma. Se la variabile d'ambiente viene modificato dopo il programma viene avviato, getenv() sarebbe ancora tornare il vecchio valore. Sulla base di questo, un approccio alternativo potrebbe essere quello di avere una classe di catturare tutte le variabili di ambiente richieste come attributi. La classe è popolato all'inizio del programma, e fornisce solo (const-qualificato) metodi di accesso. In questo modo il getenv() si chiama esattamente una volta per ogni variabile d'ambiente. Sul lato negativo, la classe prende un po 'di spazio.

Nel metodo alternativo, che non utilizza alcun spazio, getenv() viene chiamata ogni volta che è necessario il valore di qualsiasi variabile ambiente. Non è che la chiamata getenv() è costoso (in realtà non lo’so), ma porta un falso presupposto per il programmatore che l'ultima valore potrebbe essere restituito.

Anche avere una classe può essere utile astratto se c'è qualche dipendenza nel utilizzando le variabili environement, ad esempio

if $OS = "SunOs" 
then 
    GCC="/bin/gcc" 
else 
    GCC="/usr/bin/gcc" 

(this is just an example though)

Ora, una funzione che non si preoccupano di $OS ma ha solo bisogno $GCC, può semplicemente fare riferimento a envClass->get("GCC");

Solo un pensiero.

Io di solito faccio con una classe che i carichi di configurazione delle impostazioni (sia dall'ambiente o un file di configurazione). Ho un'istanza di una singola istanza globale di esso in fase di avvio. Le impostazioni del programma sono un metodo o una proprietà dell'oggetto classe di configurazione. E 'semplice e quando si scrive codice è abbastanza chiaro quello che intendeva:

if ( configuration.ExitOnFailure && IsError() )
   exit();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top