C ++ تعيين const إلى متغير البيئة أو القيمة الافتراضية

StackOverflow https://stackoverflow.com/questions/3936212

سؤال

لتطبيق يستخدم عددًا من متغيرات البيئة ، هل هناك نوع من الاتفاقية أو "أفضل الممارسات" عندما يتعلق الأمر بالاستيلاء على متغيرات البيئة ووضعها إما في بنية أو حفنة من const'س؟ من الواضح ، أريد أن أتوقف عن القيمة الافتراضية لكل متغير بيئة. في الوقت الحالي ، يبدو أن استخدام ما يلي طريقة فوضوية للغاية للقيام بذلك:

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

يمكنني أيضًا كتابة وظيفة تلتف getenv لإرجاع القيمة الافتراضية إذا كان متغير البيئة فارغًا ، لكنني لست متأكدًا مما إذا كانت هذه هي أفضل طريقة للقيام بذلك. يمكنني أيضًا التخلص من استخدام const, ، لكن هذا لا يبدو شيئًا جيدًا ، أيضًا.

أي أفكار؟

هل كانت مفيدة؟

المحلول

ماذا عن:

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

يستخدم ك:

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

نصائح أخرى

جيمس ماكنليس قدمت أ إجابة رائعة, ، ولكن هنا رأي بديل:

أظن getenv() إرجاع قيمة متغير البيئة في وقت بدء البرنامج. إذا تم تغيير متغير البيئة بعد بدء البرنامج ، getenv() لا يزال سيعود القيمة القديمة. بناءً على ذلك ، قد يكون النهج البديل هو وجود فئة لالتقاط جميع متغيرات البيئة المطلوبة كسمات. يتم ملء الفصل في بداية البرنامج ، ويوفر فقط أساليب ملحق (مؤهلة). بهذه الطريقة getenv() يسمى بالضبط مرة واحدة لكل متغير بيئة. على الجانب السلبي ، يشغل الفصل بعض المساحة.

في النهج البديل ، الذي لا يستخدم أي مساحة ، getenv() يتم استدعاؤه كلما كانت قيمة أي متغير بيئة مطلوبة. ليس هذا getenv() المكالمة باهظة الثمن (في الواقع لا أعرف) ، لكنها تحمل افتراضًا خاطئًا للمبرمج بأنه قد يتم إرجاع أحدث قيمة.

قد يكون وجود فئة أيضًا مفيدًا للتجريد إذا كان هناك أي اعتماد في استخدام متغيرات البيئة ، على سبيل المثال

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

(this is just an example though)

الآن ، وظيفة لا تهتم بها $OS ولكن يحتاج فقط $GCC, ، يمكن فقط الرجوع إلى envClass->get("GCC");

مجرد فكرة.

عادةً ما أقوم بذلك باستخدام فئة تقوم بتحميل إعدادات التكوين (إما من البيئة أو ملف التكوين). أقوم بتثبيت مثيل عالمي واحد له عند بدء التشغيل. إعدادات البرنامج هي طريقة أو خاصية لكائن فئة التكوين. الأمر بسيط وعندما تكتب رمزًا ، فمن الواضح تمامًا ما تقصده:

if ( configuration.ExitOnFailure && IsError() )
   exit();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top