سؤال

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

في ملف AC

static int val = 10;
globalvar = val;

في ملف قبل الميلاد

extern globalvar;

ولكن في هذه الحالة ، لن يتم تحديث أي تغييرات في VAL (ملف AC) في GlobalVar في (ملف قبل الميلاد).

واسمحوا لي أن أعرف كيف يمكنني تحقيق الشيء نفسه.

شكرا ، سيكندار.

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

المحلول

حسنًا ، إذا كنت تستطيع تعديل الملف a.c ثم فقط جعل val غير منتظم.

إذا كنت تستطيع التعديل a.c لكن لا يمكن أن تجعل val غير متكبر (لماذا؟) ، ثم يمكنك فقط إعلان مؤشر عالمي له في a.c

int *pval = &val;

و في b.c فعل

extern int *pval;

مما سيتيح لك الوصول إلى القيمة الحالية لـ val عبر *pval. أو يمكنك تقديم دالة غير منتظمة من شأنها إرجاع القيمة الحالية لـ val.

ولكن مرة أخرى ، إذا كنت بحاجة إلى الوصول إليها من وحدات الترجمة الأخرى ، فما عليك سوى جعلها غير منتظمة.

نصائح أخرى

يمكنك جعل المؤشر المتغير العالمي للمتغير الثابت العالمي.

/* file  a.c */
static int a = 100; /* global static variable not visible outside this file.*/
int *b = &a; /* global int pointer, pointing to global static*/


/* file b.c */
extern int *b; /* only declaration, b is defined in other file.*/

int main()
{
        printf("%d\n",*b); /* dereferencing b will give the value of variable a in file a.c */
        return 0;
}

على الجري:

$ gcc *.c && ./a.out
100

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

إذا كنت بحاجة حقًا إلى القيام بذلك ، فلديك خياران.

  1. أضف وظيفة ملحق إلى الملف الذي يحتوي على المتغير الثابت. الشيء الجميل هو أن هذا يقيد الوصول من خارج الملف إلى الوصول للقراءة فقط:

    int read_static () {return val ؛ }

  2. إسقاط التصفيات الثابتة وجعل المتغير عالميا.

الحل 1:

في ملف AC

static int val=10;
int *globalvar =&val;

في ملف قبل الميلاد

extern int *globalvar;

الحل 2:

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

ينصح الحل 2 ، ولكن في حالة تقييدك على تغيير المتغير الثابت إلى Extern ، استخدم الحل 1.

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