الوصول إلى متغير ثابت عالمي من ملف آخر في C.
-
21-09-2019 - |
سؤال
بلغة 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
لا يمكنك الوصول إلى متغير ثابت على مستوى الملف خارج الملف.
إذا كنت بحاجة حقًا إلى القيام بذلك ، فلديك خياران.
أضف وظيفة ملحق إلى الملف الذي يحتوي على المتغير الثابت. الشيء الجميل هو أن هذا يقيد الوصول من خارج الملف إلى الوصول للقراءة فقط:
int read_static () {return val ؛ }
إسقاط التصفيات الثابتة وجعل المتغير عالميا.
الحل 1:
في ملف AC
static int val=10;
int *globalvar =&val;
في ملف قبل الميلاد
extern int *globalvar;
الحل 2:
بدلاً من وجود متغير آخر لتمرير عنوان المتغير الثابت وبالتالي إضافة قلة بايت الذاكرة ، اجعل المتغير الثابت نفسه كخارجية.
ينصح الحل 2 ، ولكن في حالة تقييدك على تغيير المتغير الثابت إلى Extern ، استخدم الحل 1.