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

Я читаю книгу по языку C ('Mastering 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()?


person munjal007    schedule 03.02.2015    source источник
comment
Может быть, вы читаете книгу по C++?   -  person ForceBru    schedule 03.02.2015
comment
@al-Acme: Второй хит - это вопрос...   -  person Thomas Padron-McCarthy    schedule 03.02.2015
comment
@ThomasPadron-McCarthy - Посмотри еще раз. :D   -  person Sadique    schedule 03.02.2015
comment
@al-Acme: это страница Википедии, на которой объясняется оператор разрешения области видимости на 3 языках (включая C++). Это не говорит о том, что его не существует в C или, если на то пошло, в любом другом языке. На самом деле там написано 'Другие языки... имеют как разрешение области видимости, так и доступ к методам', то есть оставляет открытым вопрос о том, существует ли он в C.   -  person abligh    schedule 03.02.2015
comment
@munjal007: не стесняйтесь называть и стыдить книгу, если она действительно предназначена для книги C.   -  person abligh    schedule 03.02.2015
comment
@abligh - Таким образом, это также оставляет вопрос: есть ли оператор разрешения области в Java/Javascript/Python/ Blah... в любом случае, SO раздает 10-15 голосов в эти дни на такие простые вопросы, в то время как ответы, требующие усилий, ничего не получают.   -  person Sadique    schedule 03.02.2015
comment
@al-Acme действительно так делает. Например, в Perl есть такой, которого нет в списке. Я хочу сказать, что его отсутствие на этой странице не отвечает на вопрос ОП.   -  person abligh    schedule 03.02.2015
comment
Не говоря уже об повторяющемся вопросе.   -  person Sadique    schedule 03.02.2015
comment
@abligh Я хочу сказать, что этот вопрос не заслуживает 3 голосов, а ответ не заслуживает 9 голосов (не то, чтобы я имел что-то против вас - вы не сделали ничего плохого, опубликовав правильный ответ) For instance there is one in perl and that's not listed - моя точка зрения была проста для этого требовался поиск в гугле.   -  person Sadique    schedule 03.02.2015
comment
Этот вопрос должен получить больше голосов, но только в том случае, если будет включена ссылка на автора и название книги. И надеюсь, что тогда люди придут сюда, чтобы узнать пример книги, которую не нужно читать, чтобы выучить C.   -  person Brandin    schedule 03.02.2015


Ответы (6)


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

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

person abligh    schedule 03.02.2015
comment
Perhaps your book is confusing C with C++ Надеюсь, читатель, а не книга. - person Iharob Al Asimi; 03.02.2015
comment
@iharob: Я не делаю предположений :-) Я видел ужасные книги. Я все же отредактирую. - person abligh; 03.02.2015
comment
@iharob: название книги — mastering in C. Вопросы в этой книге хорошие, но автор немного ошибся. - person munjal007; 03.02.2015
comment
@ munjal007 Это не маленькая ошибка, это опечатка. Но оператора в с не существует, понятия пространства имен тоже в с не существует. Я нашел ошибку на странице 64 таблицы приоритета операторов. - person Iharob Al Asimi; 03.02.2015
comment
@iharob, страница 203 этой книги (books.google.co.uk/) расскажет вам, как использовать таинственный несуществующий оператор области C. Возможно, есть какой-то (нестандартный) вариант C, который все-таки его поддерживает? - person abligh; 03.02.2015
comment
Я удивлен, что автор не упомянул оператор goes to. - person Iharob Al Asimi; 03.02.2015
comment
@abligh Я думаю, что книга, вероятно, просто не очень хороший справочник. Если бы я это читал, я бы тоже был в замешательстве. Посмотрите на их версию и объяснение Hello world на страницах 18,19. The line `void main()` marks the beginning of the program that gets executed when the program is run. Some traditional compilers may report an error on this line. In such cases, remove the keyword void, chainging the line to `main()`. --- забавно, я всегда думал, что это int main. - person Brandin; 03.02.2015

Нет, пространства имен — это функция 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;
}

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

person rubikonx9    schedule 03.02.2015

Оператор :: доступен в 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.

person Spikatrix    schedule 03.02.2015

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

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

person Jens    schedule 03.02.2015

В простом 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;
}
person Karel Kubat    schedule 03.02.2015

Вы можете использовать указатели для доступа и редактирования глобальных переменных в 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;
}
person Rishabh Ryber    schedule 17.02.2018