Это полезно, когда у вас есть глобальные переменные. Вы объявляете о существовании глобальных переменных в заголовке, так что каждый исходный файл, содержащий заголовок, знает об этом, но вам нужно только «определить» его один раз в одном из ваших исходных файлов.
Чтобы уточнить, использование extern int x;
сообщает компилятору, что объект с int
именем типа x
существует где-то . Это не работа компилятора, чтобы знать, где он существует, просто нужно знать тип и имя, чтобы он знал, как его использовать. Как только все исходные файлы скомпилированы, компоновщик разрешит все ссылки x
на одно определение, которое он найдет в одном из скомпилированных исходных файлов. Чтобы это работало, определение x
переменной должно иметь то, что называется «внешней связью», что в основном означает, что она должна быть объявлена вне функции (в том, что обычно называется «областью действия файла») и без static
ключевого слова.
заголовок:
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
источник 1:
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
источник 2:
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
extern
в нескольких случаях. Инструменты Microsoft создали ошибку ссылки для отсутствующих символов, когда таблицы в другом исходном файле были определены только. Проблема была в том, что таблица была,const
и компилятор C ++ сделал этоstatic
в модуле перевода. Смотри, например,ariatab.cpp
иkalynatab.cpp
.