"extern" внутри функции?
Хорошо, прочитав "немного старую" книгу ( "Язык программирования C", второе издание, Деннис Ритчи), я получил крест:
Внешняя переменная должна быть определена ровно один раз вне любой функции; это откладывает хранение для него. Переменная должна также быть объявлена в каждой функции, которая хочет получить к ней доступ.
и я подумал: что?!
"Эта переменная также должна быть объявлена в каждой функции, которая хочет получить к ней доступ". Затем я был потрясен еще раз:
int max;
/* ... */
int main()
{
extern int max;
/* ... */
}
И еще один - что?!
Насколько я знаю (очевидно, это не так много и далеко не достаточно), extern
имеет смысл только тогда, когда вы определяете глобальную переменную где-то, и вы хотите получить к ней доступ через другой файл (чтобы не определять его снова).
Итак:
- Какова точка этого
extern int max
внутри main
или любой другой функции?
- Действительно ли стандарт говорит, что это обязательно (что мне нужно объявить для этого примера этот максимум в каждой функции, который будет использовать его?)
- Это то же самое для С++ (почему я поместил тег С++)? Это первый раз, когда я вижу что-то вроде этого.
Примечание: это не то же самое, что В чем заключается использование объявления статической переменной как extern внутри функции?
Ответы
Ответ 1
Ваш пост удивил меня. У меня не было воспоминаний об этом, и я давно читал K & R. У меня только первое издание здесь, и оно есть тоже. Однако это еще не все. Из первого издания:
Переменная должна также быть объявлена в каждой функции, которая хочет доступ к нему; это может быть сделано либо с помощью явной декларации extern или неявно по контексту.
Обратите внимание на "неявно по контексту". Позже в тексте:
... если внешнее определение переменной происходит в исходном файле до его использования в определенной функции, тогда нет необходимости в extern в функции. Внешние декларации в основном,..., таким образом, являются излишними. Фактически, обычной практикой является размещение определения всех внешних переменных в начале источника файл, а затем опустить все объявления extern.
Таким образом, это говорит о том, что визуализация внешней переменной может быть выполнена внутри функции только для этой функции или может быть выполнена за пределами любой функции для всех функций, следующих за ней в исходном файле. Я считаю, что это единственное место в книге, где это делается внутри функции, позже он использует знакомый один раз для файлового подхода.
Ответ 2
extern int max
внутри main
или function говорит компилятору: "Я не локальная переменная внутри main или функции, я глобальная переменная, определенная в другом месте".
Если глобальный объявлен в том же файле, не полезно. В другом файле, да, но не в каждой функции, просто объявите один раз в заголовочном файле источника, который использует эту глобальную переменную. c++
же самое в c++
.
Ответ 3
extern
- связь. Это означает, что это имя max
связано с другими вхождениями имени, возможно, в другие файлы. (То есть, когда объектные модули связаны между собой для создания исполняемого файла, все связанные ссылки на это имя будут сделаны для ссылки на один и тот же объект.)
Объем этого объявления - это остаток тела функции, в котором он находится. Это означает, что другие функции в этом файле не видят имени, объявленного этим объявлением (если только они не объявляют его сами).
Сфера и связь - это разные вещи.