Я начинаю сомневаться в полезности ключевого слова «extern», которое используется для доступа к переменным/функциям в других модулях (в других файлах). Разве мы не делаем то же самое, когда мы используем препроцессор #include для импорта файла заголовка с помощью прототипов переменных/функций или определений функций/переменных?В чем разница между использованием файлов extern и #include?
ответ
extern
необходим, поскольку он заявляет, что символ существует и имеет определенный тип и не выделяет для него хранилище.
Если вы:
int foo;
В заголовочном файле, который распределяется между несколькими исходными файлами, вы получите ошибку компоновщика, потому что каждый источник должен иметь свою собственную копию обув, созданные и компоновщик не сможет для разрешения символа.
Вместо этого, если у вас есть:
extern int foo;
В заголовке, было бы объявить символ, который определен в другом месте в каждом исходном файле.
один (и только один) исходный файл будет содержать
int foo;
, который создает один экземпляр Foo для линкера, чтобы решить.
№ #include - это команда препроцессора, в которой говорится: «Поместите весь текст из этого другого файла прямо здесь». Таким образом, все функции и переменные во включенном файле определяются в текущем файле.
- 1. В чем разница между volatile & extern?
- 2. В чем разница между INCLUDE 'param.inc' и INCLUDE 'param.fi'?
- 3. В чем разница между тегом include и функцией include?
- 4. разница между extern «C» и просто extern
- 5. В чем разница между использованием и внешним?
- 6. В чем разница между staload и #include в ATS?
- 7. В чем разница между int и extern int в C?
- 8. В чем разница между `# include` и` extern` при импорте внешней переменной на локальную?
- 9. В чем разница между #import и #include в C?
- 10. Разница между cq: include и sling: include
- 11. В чем разница между @include и @match в пользовательских сценариях?
- 12. В чем разница между ng-include и ngroute в angularjs
- 13. В чем разница между шаблоном include и static в Django?
- 14. В чем разница между include и require в Ruby?
- 15. В чем разница между «include» и «preend» в Ruby?
- 16. В чем разница между «extends» и «include» в Jade?
- 17. В чем разница между include() и вызовом функции в PHP?
- 18. В языке C В чем разница между extern buffer [] и extern * buffer?
- 19. В чем разница между `extern int (x) []` и `extern int x []` в C?
- 20. Erlang: в чем разница между «include_lib» и «include»?
- 21. В чем разница между `Range # include?` И `Range # cover?`?
- 22. В чем разница между xsd: include и xsd: import?
- 23. В чем разница между @Lield Laravel и @include?
- 24. Разница между INCLUDE и модулями в Fortran
- 25. В чем разница между armv6 и i386?
- 26. В чем разница между включать и parsedinclude
- 27. В чем разница между использованием и включением в C++?
- 28. В чем разница между/usr/include/linux и папкой include в Linux-источнике ядра?
- 29. В чем разница между system() и execve()
- 30. В чем разница между «и»?
Но разве вы не можете получить доступ к int foo без объявления с помощью extern int foo, пока вы включаете заголовочный файл, содержащий его определение? –
Как упоминалось в jcopenha, #include просто вставляет текст из включенного файла в исходный файл - компилятор действительно не знает о включенных файлах и не относится к ним специально. Итак, если у вас есть A.c, B.c и C.c, каждый с «int foo», и вы связываете их вместе, как вы разрешаете foo? Он существует в трех разных местах. extern просто означает, что символ существует где-то в другом месте. Вы можете использовать его, но кто-то другой несет ответственность за его создание. – Michael
Вы найдете, что для функций, где есть только один экземпляр программ foo_fun() с модулями, которые вызывают foo_fun(), будут работать с extern или без него. Поэтому в этих случаях вы должны попытаться понять это. Когда вы попадаете в общую глобальную переменную, вы должны быть действительно понятны, некоторые компиляторы это выясняют, а некоторые нет. –