"extern" внутри функции? - программирование

"extern" внутри функции?

Хорошо, прочитав "немного старую" книгу ( "Язык программирования C", второе издание, Деннис Ритчи), я получил крест:

Внешняя переменная должна быть определена ровно один раз вне любой функции; это откладывает хранение для него. Переменная должна также быть объявлена ​​в каждой функции, которая хочет получить к ней доступ.

и я подумал: что?!

"Эта переменная также должна быть объявлена ​​в каждой функции, которая хочет получить к ней доступ". Затем я был потрясен еще раз:

int max; 
/* ... */
int main()
{
    extern int max;
    /* ... */
}

И еще один - что?!


Насколько я знаю (очевидно, это не так много и далеко не достаточно), extern имеет смысл только тогда, когда вы определяете глобальную переменную где-то, и вы хотите получить к ней доступ через другой файл (чтобы не определять его снова).

Итак:

  • Какова точка этого extern int max внутри main или любой другой функции?
  • Действительно ли стандарт говорит, что это обязательно (что мне нужно объявить для этого примера этот максимум в каждой функции, который будет использовать его?)
  • Это то же самое для С++ (почему я поместил тег С++)? Это первый раз, когда я вижу что-то вроде этого.

Примечание: это не то же самое, что В чем заключается использование объявления статической переменной как extern внутри функции?

4b9b3361

Ответ 1

Ваш пост удивил меня. У меня не было воспоминаний об этом, и я давно читал K & R. У меня только первое издание здесь, и оно есть тоже. Однако это еще не все. Из первого издания:

Переменная должна также быть объявлена ​​в каждой функции, которая хочет доступ к нему; это может быть сделано либо с помощью явной декларации extern или неявно по контексту.

Обратите внимание на "неявно по контексту". Позже в тексте:

... если внешнее определение переменной происходит в исходном файле до его использования в определенной функции, тогда нет необходимости в extern в функции. Внешние декларации в основном,..., таким образом, являются излишними. Фактически, обычной практикой является размещение определения всех внешних переменных в начале источника файл, а затем опустить все объявления extern.

Таким образом, это говорит о том, что визуализация внешней переменной может быть выполнена внутри функции только для этой функции или может быть выполнена за пределами любой функции для всех функций, следующих за ней в исходном файле. Я считаю, что это единственное место в книге, где это делается внутри функции, позже он использует знакомый один раз для файлового подхода.

Ответ 2

extern int max внутри main или function говорит компилятору: "Я не локальная переменная внутри main или функции, я глобальная переменная, определенная в другом месте".

Если глобальный объявлен в том же файле, не полезно. В другом файле, да, но не в каждой функции, просто объявите один раз в заголовочном файле источника, который использует эту глобальную переменную. c++ же самое в c++.

Ответ 3

extern - связь. Это означает, что это имя max связано с другими вхождениями имени, возможно, в другие файлы. (То есть, когда объектные модули связаны между собой для создания исполняемого файла, все связанные ссылки на это имя будут сделаны для ссылки на один и тот же объект.)

Объем этого объявления - это остаток тела функции, в котором он находится. Это означает, что другие функции в этом файле не видят имени, объявленного этим объявлением (если только они не объявляют его сами).

Сфера и связь - это разные вещи.