سؤال

قرأت بعض الإجابات حول هذا الموضوع، لكني لا زلت غير متأكد:

في لغة C++، يتم تعريف متغير const العام تلقائيًا static.ومع ذلك يمكنني الوصول إليه من ملف cpp آخر من خلال extern:

// module.cpp

const int i = 0;

و

// main.cpp

extern const int i;

int main ()
{
    if (i > 10)
        return 0;
    else
        return 1;
}

لماذا يكون هذا ممكنًا (الوصول إلى كائن ذي رابط داخلي من وحدة أخرى)؟عادة يجب أن أضطر إلى تحديد i مثل extern const int i = 0 في Module.cpp، للحصول على صراحة عالمية ولكن غير ثابتة, ، أو؟

بالمقارنة هذا غير ممكن:

// module.cpp

static int i = 0;

و

// main.cpp

extern int i;

int main ()
{
    i = 10; // but read-only access like (i > 10) would be possible!
    return 0;
}

إذن الجواب هو أن:نعم، يمكنك الوصول إلى الكائنات المرتبطة الداخلية من وحدات أخرى، ولكن فقط للقراءة (لذلك دائمًا مع const)؟

يحرر:

آسف ولكني أخطأت:في الكود الأصلي الخاص بي حاولت للتو التعبير بدون تأثير (في كلا المثالين):

extern const int i; // or extern int i for second example
int main ()
{
    i>10;
    return 0;
}

اعتقدت أنه يتصرف بنفس الطريقة، كما لو كان تدفق البرنامج أو البيانات يعتمد على هذا التعبير، لكنه في الواقع لا يفعل ذلك!يبدو أن المترجم قد قطع هذا التعبير غير الفعال، بحيث لا يراه الرابط!لذلك كل شيء على ما يرام:في المثال الأول i يجب أن يتم تعريفها بالفعل extern const int i = 0 في Module.cpp، وفي المثال الثاني i لا يمكن الوصول إليه على الإطلاق (إلا في تعبير غير فعال).المترجم هو VC++2010.

تحرير 2:

ومع ذلك، الآن لا أفهم لماذا هذا ممكن:

// module.cpp

extern const int i = 0;

و

// main.cpp

int i = 99;

int main ()
{
    bool b = i>10;
    return 0;
}

i لديهم كل من الارتباط الخارجي.ولكن لا يوجد خطأ.عندما أقوم بتحديد ملف Module.cpp int i = 0, ثم خطأ (رموز متعددة).لماذا؟

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

المحلول

أما بالنسبة لي فيبدو وكأنه خطأ في المترجم.لم يتم تعريف المتغير الثابت i، وتم الإعلان عنه فقط في main.cpp.أما بالنسبة للمتغير i في Module.cpp، فهو يحتوي على رابط داخلي ولا يمكن الوصول إليه خارج الوحدة.

بالنسبة لإضافتك إلى المنشور الأصلي، فإن المترجم ليس لديه أي شيء مشترك مع هذا الموقف.إنه الرابط الذي يتحقق مما إذا كانت هناك رموز خارجية مكررة.أعتقد أنه قرر أنه إذا كان أحد المتغيرات يحتوي على مؤهل const والآخر لا يوجد به متغيران مختلفان.أعتقد أنه يتم تحديد التنفيذ ما إذا كان الرابط سيصدر خطأ أم لا.علاوة على ذلك يمكن أن يكون لديها بعض الخيارات التي يمكن أن تتحكم في سلوك الرابط في مثل هذه المواقف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top