Есть ли оператор разрешения области видимости в языке Си?
Я читаю книгу по языку 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.