كيف يمكنني الوصول إلى متغير عمومي مظلل في لغة C؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

كيف يمكنني الوصول إلى متغير عمومي مظلل في لغة C؟في C++ يمكنني استخدام :: لمساحة الاسم العالمية.

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

المحلول

وإذا كان لديك متغير نطاق ملف ليست ساكنة، ثم يمكنك استخدام إعلانا يستخدم خارجي في نطاق متداخلة:

int c;

int main() {
    {
        int c = 0;
        // now, c shadows ::c. just re-declare ::c in a 
        // nested scope:
        {
            extern int c;
            c = 1;
        }
        // outputs 0
        printf("%d\n", c);
    }
    // outputs 1
    printf("%d\n", c);
    return 0;
}

إذا تم تعريف المتغير مع ساكنة، لا أرى وسيلة للإشارة إلى ذلك.

نصائح أخرى

وليس هناك :: في ج ولكن يمكنك استخدام وظيفة جالبة

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}

إذا كنت تتحدث عن مظلل فار العالمي، ثم (لينكس) يمكنك استخدام dlsym() للعثور على عنوان المتغير العالمي، مثل هذا:

int myvar = 5;    // global

{
    int myvar = 6;    // local var shadows global
    int *pglob_myvar = (int *)dlsym(RTLD_NEXT, "myvar");
    printf("Local: %d, global: %d\n", myvar, *pglob_myvar);
}

إذا كنت تريد التعليمات البرمجية لتبدو مثيرة، استخدم ماكرو:

#define GLOBAL_ADDR(a,b)  b =(typeof(b))dlsym(RTLD_NEXT, #a)
...
int *pglob_myvar;
GLOBAL_ADDR(myvar, pglob_myvar);
...

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

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

extern int aGlobalDefinedElsewhere;

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

  • دالات getter/setter للوصول إلى المتغير العام (وهي ممارسة جيدة، خاصة في المواقف متعددة الخيوط)

  • الأسماء المستعارة للعناصر العالمية عن طريق مؤشر محدد قبل المتغير المحلي:

    int noName;
    {
        int * aliasToNoName = &noName; /* reference to global */
        int noName;                    /* declaration of local */
        *aliasToNoName = noName;       /* assign local to global */
    }
    

ما هو "محمية متغير عمومي" في الخالص C؟

وفي C لديك المتغيرات المحلية، ملف المتغيرات المحلية / العالمية (ثابت) والمتغيرات العالمية (خارجي)

so file1.c:
int bla;

file2.c
extern int bla;

ولكن هناك خيار آخر هو مرجع عالمي قبل تحديد المحلية الخاصة بك، أو على الأقل الحصول على مؤشر بها أولا حتى تتمكن من الوصول إليه بعد تحديد المحلية الخاصة بك.

#include <stdio.h>

int x = 1234;
int main()
{
   printf("%d\n",x); // prints global
   int x = 456;
   printf("%d\n",x); // prints local
}

وGYZ ص 2 يفكر كثيرا مجرد استخدام متغير مؤشر ن تخزين عنوان المتغير العالمي في ذلك ن دن استخدامها داخل د الرئيسية (). وباستخدام مؤشر للإشارة المتغير العالمي لن يكون مشكلة حتى لو متغير محلي مع نفس الاسم يوجد داخل الرئيسي ().

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