Есть ли оператор разрешения области видимости в языке Си?

Я читаю книгу по языку C ("Освоение C") и нашел тему об операторе разрешения области видимости (::) на стр. 203, в Google Книгах здесь.

Но когда я запускаю следующий пример кода (скопированный из книги), компилятор C выдает мне ошибку. Я искал в Интернете, но мне не удалось найти какую-либо ссылку на оператор разрешения области видимости в C.

#include <stdio.h>
int a = 50;
int main(void)
{
    int a =10;  
    printf("%d",a);
    printf("%d\n", ::a);        
    return 0;
}

Так что, если я хочу получить доступ к глобальной переменной, то как я могу сделать это из main() функция?

7 ответов

Нет. C не имеет оператора разрешения области видимости. У С ++ есть один (::). Возможно, вы (или ваша книга) путаете C с C++.

Вы спросили, как вы можете получить доступ к глобальной переменной a изнутри функции (здесь main) которая имеет свою локальную переменную a, Вы не можете сделать это в C. Это лексически выходит за рамки. Конечно, вы можете взять адрес переменной где-нибудь еще и передать его как указатель, но это совсем другое дело. Просто переименуйте переменную, то есть "не делайте этого"

Нет, пространства имен - это особенность C++.

Однако можно ссылаться на глобальный a в вашем примере. Вы можете достичь этого с помощью extern ключевое слово:

#include <stdio.h>

int a = 50;

int main(void)
{
    int a = 10;
    printf("%d\n",a);

    { // Note the scope
        extern int a; // Uses the global now
        printf("%d\n", a);
    }

    return 0;
}

Это немного сложно, хотя. Это плохой стиль. Не делай этого.

:: оператор доступен на C++, а не на C. Если вы хотите получить доступ к глобальной переменной, используйте

#include <stdio.h>
int a = 50;
int main(void)
{
    int a =10;
    printf("%d",a); //prints 10
    {
        extern int a;
        printf("%d", a); //prints 50
    }
    return 0;
}

Или вы можете использовать указатель, который содержит адрес глобальной переменной a а затем разыменуйте указатель, если вы хотите напечатать значение глобальной переменной a,

Нет (:: оператор специфичен для C++). В C, если вы используете один и тот же идентификатор в разных перекрывающихся областях (скажем, область видимости файла a и заблокировать область a), идентификатор области видимости блока затеняет идентификатор области действия файла, и нет никакого способа обратиться к затененному идентификатору.

Как правило, это лучшая практика программирования, чтобы избежать теневых переменных. Многие программы типа lint могут предупредить об этой ситуации.

Вы можете использовать указатели для доступа и редактирования глобальных переменных в C.

#include <stdio.h>
#include <stdlib.h>

int a;
a=78;
int *ptr=&a;            //pointer for global a
int main()
{
    int a=0;
    printf("%d",a);         //Prints 0 as local variable
    printf("%d",*ptr);
    ptr=30;      //changes the value of global variable through pointer
    printf("%d",*ptr);      //Now it prints 30
    return 0;
}

В простом C нет разрешения области видимости. Вы должны назвать свои переменные по-другому.

Это означает, что все переменные a Ниже приведены разные:

#include <stdio.h>
int a = 50;
int main(void)
{
    int a = 10;
    {
        int a = 20;
        int i;
        for (i = 0; i < 10; i++) {
            int a = 30;
        }
    }
    return 0;
}

Это полностью зависит от того, какой компилятор вы используете для выполнения своего кода.

      #include <stdio.h>
int a = 50;
int main(void)
{
   int a =10;  
   printf("%d\n",a);
   printf("%d\n", ::a);        
   return 0;
}

Попробуйте запустить этот код в компиляторе Turbo C , и вы получите результат.

Теперь, что касается книги C, которую вы читаете, коды примеров, представленные в книге, должны относиться к компилятору Turbo C/C++, а не к компилятору gcc.

Другие вопросы по тегам