لماذا لا يلزم تزيين "const char *" بـ "extern" عند مشاركته عبر ملفات متعددة

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

  •  21-12-2019
  •  | 
  •  

سؤال

أثناء قراءة كتب C++، تعلمت أنه لمشاركة متغير/كائن const عبر ملفات متعددة، نحتاج إلى تعريف متغير const مرة واحدة في أحد الملفات، والإعلان عنه في كل ملف مصدر حيث يتم استخدامه.على سبيل المثال،

في file1.cpp، نحدد متغير const int عالميًا مثل

extern const int ca = 100;

في file2.cpp حيث نستخدمه، نعلن عن هذا المتغير مثل

extern const int ca;

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

في file1.cpp، نحدد متغير مؤشر const char عالميًا مثل

const char *cstr = "hello";

في file2.cpp حيث نستخدمه، نعلن عن هذا المتغير مثل

extern const char *cstr;

لجعل سؤالي أكثر تحديدًا، لماذا يمكن استخدام cstr في file2.cpp على الرغم من أنه غير مزين بـ "extern" في file1.cpp؟

تشكرات

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

المحلول

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

int const ca = 100;

في ملف مصدر ، سيكون الارتباط داخليًا ، والكيان (المتغير) ca يشير إلى أن تكون فريدة من نوعها لوحدة الترجمة.لو كنت كتبت:

int ca = 100;

سيكون الارتباط خارجيًا، لذلك

extern int ca;

في وحدة ترجمة أخرى قد تشير إلى نفس المتغير.

وبالطبع عندما تكتب:

char const* cstr = "hello";

أنت تحدد مؤشر ، وهو ليس const (على الرغم من أنه يشير إلى const).

بالطبع ، عادة ، تعلن المتغيرات في رأس ، مع extern, ، لذلك سيكون هناك إعلان سابق عند تحديد المتغيرات ، وهو أول إعلان يحدد الربط.

نصائح أخرى

يستخدم

خارجيا لجعله واضحا أن العبارة "extern const char * cstr؛"هو إعلان وليس تعريفا، يتم تعريف CSTR في مكان آخر.إذا فعلت "const char * cstr؛"سوف يفسر المحول البرمجي أنه كتعريف وكنت ينتهي بك الأمر بمتغيرات 2 CSTRES.

إذا قمت بتطبيقها خارجيا على "const char * cstr=" hello "؛"أعتقد أن المترجم يتجاهله لأن التهيئة يعني أنك تحدد في الواقع المتغير.

المزيد هنا: http://en.wikipedia.org/wiki/external_variable

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