C ++ assign const Umgebungsvariablen oder Standardwert
-
30-09-2019 - |
Frage
Für eine Anwendung, die eine Reihe von Umgebungsvariablen verwendet, ist es eine Art einer Konvention oder „best practice“, wenn es darum geht, Umgebungsvariablen zu greifen und setzen sie entweder in einer Struktur oder ein Bündel von const
ist? Natürlich, ich will für jede einzelne Umgebungsvariable auf einen Standardwert zu Rückfall. Im Augenblick scheint die folgende Verwendung wie eine sehr unordentlich Art und Weise tun:
char* x;
const SOME_VARIABLE;
if (NULL == (x = getenv("SOME_VARIABLE")))
SOME_VARIABLE = 5; // default value
else
SOME_VARIABLE = x;
Ich könnte auch eine Funktion schreiben, dass Wraps getenv
einen Standardwert zurück, wenn eine Umgebungsvariable leer ist, aber ich bin nicht sicher, ob das auch der beste Weg, es zu tun. Ich könnte auch mit der Verwendung von const
abschaffen, aber das scheint nicht wie eine gute Sache zu tun, auch nicht.
Alle Gedanken?
Lösung
Wie wäre:
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;
}
Wird als:
const std::string some_variable = GetEnvironmentVariableOrDefault("SOME_VARIABLE", "5");
Andere Tipps
James McNellis eine große Antwort , aber hier ist eine alternative Meinung:
Ich denke, getenv()
gibt den Wert der Umgebungsvariablen zu dem Zeitpunkt das Programm gestartet wurde. Wenn die Umgebungsvariable geändert wird, nachdem das Programm gestartet wird, würde getenv()
noch den alten Wert zurück. Auf dieser Basis kann ein alternativer Ansatz sein, um eine Klasse zu haben, alle erforderlichen Umgebungsvariablen als Attribut zu erfassen. Die Klasse wird zu Beginn des Programms gefüllt und bietet nur (const qualifiziert) Accessormethoden. Auf diese Weise die getenv()
genannt wird genau einmal für jede Umgebungsvariable. Auf der negativen Seite, nimmt die Klasse etwas Platz nach oben.
In dem alternativen Ansatz, der keinen Raum nicht verwendet, getenv()
wird aufgerufen, wenn der Wert einer Umgebungsvariable erforderlich ist. Es ist nicht, dass der getenv()
Anruf teuer ist (eigentlich kann ich nicht‘wissen), aber es trägt eine falsche Annahme für den Programmierer, dass der letzte Wert zurückgegeben werden könnte.
Auch eine Klasse mit abstrahieren kann nützlich sein, wenn es eine Abhängigkeit ist die environement Variablen in Verwendung, z.B.
if $OS = "SunOs"
then
GCC="/bin/gcc"
else
GCC="/usr/bin/gcc"
(this is just an example though)
Nun wird eine Funktion, die über $OS
nicht kümmern, sondern braucht nur $GCC
kann beziehen sich nur auf envClass->get("GCC");
Nur so ein Gedanke.
Ich tue dies in der Regel mit einer Klasse, die Lasten Einstellungen Konfiguration (entweder aus der Umgebung oder einer Konfigurationsdatei). Ich instanziiert eine einzige globale Instanz davon beim Start. Die Programmeinstellungen sind eine Methode oder Eigenschaft des Konfigurationsklassenobjekt. Es ist einfach und wenn Sie Code schreiben, es ist ziemlich klar, was Sie bestimmt:
if ( configuration.ExitOnFailure && IsError() )
exit();