Це корисно, коли у вас є глобальні змінні. Ви заявляєте про існування глобальних змінних у заголовку, так що кожен вихідний файл, що включає заголовок, знає про нього, але вам потрібно лише "визначити" його один раз в одному з вихідних файлів.
Для уточнення, використовуючи 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
.