В чем разница между использованием extern и #include заголовочных файлов? - PullRequest
17 голосов
/ 25 августа 2009

Я начинаю сомневаться в полезности ключевого слова "extern", которое используется для доступа к переменным / функциям в других модулях (в других файлах). Разве мы не делаем то же самое, когда используем препроцессор #include для импорта заголовочного файла с прототипами переменных / функций или определениями функций / переменных?

Ответы [ 2 ]

20 голосов
/ 25 августа 2009

extern необходим, потому что он объявляет, что символ существует и имеет определенный тип, и не выделяет для него память.

Если вы делаете:

int foo;

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

Вместо этого, если у вас есть:

extern int foo;

В заголовке будет объявлен символ, определенный в другом месте каждого исходного файла.

Один (и только один) исходный файл будет содержать

int foo;

, который создает единственный экземпляр foo для разрешения компоновщиком.

2 голосов
/ 25 августа 2009

Нет. #Include - это команда препроцессора, которая говорит "поместите весь текст из этого другого файла прямо здесь". Итак, все функции и переменные во включенном файле определены в текущем файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...