سؤال

لقد صادفت مؤخرًا سؤالًا مثل كيفية الوصول إلى المتغير الذي أعلن أنه ثابت في file1.c إلى file2.c آخر؟

هل من الممكن الوصول إلى متغير ثابت؟

ما أفهمه حول الكلمة الأساسية الثابتة في لغة C هو،

static هي "ارتباط داخلي"، لذا لا يمكن الوصول إليها إلا من وحدة تجميع واحدة - تلك التي تم تعريفها فيها.الكائنات المعلنة ذات الارتباط الداخلي تكون خاصة بوحدة واحدة.

كأحد أصدقائي يقترح علي الحل أدناه.

في file1.c

   #include <stdio.h>

   int main()
   {
          int b=foo();
          printf("%d",b);
          return 0;
   }

في file2.c

   static int a=25;

   int foo()
   {
        return a;
   }

جمعتها gcc file1.c file2.c -o file

إذا فعلت أعلاه يمكنني الوصول إلى المتغير.

لذلك أسئلتي هي:

  1. هل ينتهك البرنامج أعلاه قواعد المتغير الثابت؟

  2. إذا لم يكن الأمر كذلك، فلماذا هذا الأمر، وهل هناك أي طريقة أخرى للوصول إلى المتغير الثابت باستثناء تضمين الملف (#include <…>) ليس كذلك.

    كيف يمكنني الوصول إلى متغير ثابت من ملف آخر؟

    في لغة C، كيف يمكنني تقييد نطاق المتغير العام بالملف الذي تم الإعلان عنه فيه؟

  3. صححني إذا كنت مخطئًا في مفهوم المتغير الثابت وإذا كانت هناك حلول أفضل متاحة للوصول إلى المتغير الثابت؟

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

المحلول

1) هل ينتهك البرنامج أعلاه قواعد المتغير الثابت؟

لا، أنت لا تخالف أي قواعد.تقوم وظيفة foo هنا بإنشاء نسخة من قيمة هذا المتغير الثابت واستخدامها في ملف آخر.لا بأس.

2) إذا لم يكن الأمر كذلك، فهل هناك أي طريقة أخرى للوصول إلى متغير ثابت باستثناء تضمين الملف (#include<>) ليس هكذا كيف يمكنني الوصول إلى متغير ثابت من ملف آخر؟

المتغير الثابت مخصص فقط للاستخدام في هذا الملف فقط.

لا يمكنك استخدام هذا المتغير مما يجعله خارجيًا في ملفات أخرى.

الاختراق القذر الآخر هو الحصول على مؤشر لهذا المتغير الثابت وجعله كمؤشر عام وجعله خارجيًا في ملف آخر يمكنك استخدام هذا المتغير الثابت.

file1.c

 #include<stdio.h>
  static int a=25;
  int* ptr = &a;

file2.c

#include<stdio.h>
extern int *ptr;

   int main()
   {
          printf("%d",*ptr);
          return 0;
   }

صححني إذا كنت مخطئًا في مفهوم المتغير الثابت وإذا كانت هناك حلول أفضل متاحة؟

  1. المتغير الثابت له عمر يمتد عبر كامل تشغيل البرنامج

  2. إذا لم تقم بتهيئة المتغير الثابت ببعض القيمة، فستكون قيمته الافتراضية 0.

  3. المتغير الثابت له نطاق يقتصر على ملفه فقط.لا يمكنك الوصول إليه بالاسم من ملف مختلف.

  4. لديك temp1.c وemp2.c يتم تجميعهما معًا، ثم يمكنك أيضًا الحصول على متغير ثابت يحمل نفس الاسم في كلا الملفين - وهما متغيران منفصلان.

في لغة C، كيف يمكنني تقييد نطاق المتغير العام بالملف الذي تم الإعلان عنه فيه؟

عن طريق جعل هذا المتغير العالمي ثابتًا.

نصائح أخرى

ما نسميه عادةً متغيرًا في لغة C هو في الواقع شيئين:ان هدف, ، الذاكرة المخصصة للمتغير المفسر بنوع معين، و معرف, ، إحدى طرق الوصول إلى هذا الكائن.

لا توجد مشكلة في الوصول إلى static هدف أو قيمته من وحدة تجميع أخرى.وظيفتك foo يروج للقيمة إلى وحدة أخرى، وهذا أمر جيد، ولكنه قد يؤدي أيضًا إلى الترويج لعنوان a بدون مشاكل.

وجود رابط داخلي يتعلق فقط بالمعرف والاسم a.هذا واحد مرئي فقط في الداخل file2.c.

مع ال static int a=25; المتغير a سيكون لها ارتباط داخلي؛مما يعني أن الرابط لا يمكنه الرؤية a في أي مكان خارج file2.c تو.

عندما تتصل foo() في file2.c, ، تحصل على نسخة من a, ، إنها النسخة التي تطبعها؛ولكن هذا لا يعني أن لديك حق الوصول إلى الواقع a المعرفة في file2.c عندما تحتاج إلى مثل هذا الوصول حيث يكون المتغير نفسه مرئيًا عبر وحدات TU مختلفة، يمكنك القيام بذلك

تعريف الملف

يقوم هذا الملف بتعريف المتغير وتعريفه؛بالإضافة إلى ذلك، تتم تهيئته إلى 1 أيضًا، وبدون ذلك ستتم تهيئته افتراضيًا إلى 0.

// (non-static) global variable with external linkage and thus visible across TUs
int var_across = 0;
void use()
{
   var_across = 1;
}

باستخدام الملف

// just a declaration to tell that it's defined elsewhere; not a definition
extern int var_across;
void use_here()
{
   var_across = 2;
}

سيؤدي تعيين عنوان المتغير الثابت للمؤشر إلى جعل المتغير الثابت متاحًا للملفات الفرعية.

في الملفات الفرعية علينا استخدام الكلمة الأساسية الخارجية للمؤشر.

ولكن ليس من الضروري القيام بذلك.

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