програму, що запускається і видає на екран меню з двох пунктів
// file1.c:
int a=1;
int f () { /*щось робить*/ }
// file2.c:
extern int a;
int f (); void g () {a=f ();}
a і f (), що використаються g () в файлі file2.c, - ті же, що визначені в файлі file1. c. Ключове слово extern (зовнішній) вказує, що опис a в file2.c є (тільки) описом, а не визначенням. Якщо б a ініціалізувалась, extern був б просто проігноровано, оскільки опис з ініціалізацією завжди є визначенням. Об'єкт в програмі повинен визначатися тільки один раз. Описуватися він може багато раз, але типи повинні точно погоджуватися. Наприклад:
// file1.c:
int a=1;
int b=1;
extern int c;
// file2.c:
іnt a;
extern double b;
extern int c;
Тут три помилки: a визначене двічі (int a; є визначенням, що означає int a=0;), b описане двічі з різними типами, а c описане двічі, але не визначене. Ці види помилок (помилки компоновки) не можуть бути виявлені компілятором, що за один раз бачить тільки один файл. Компоновщик, однак, їх виявляє. Наступна програма не є C++ - програмою (хоча CІ програмою є):
// file1.c:
int a;
int f () {return a;}
// file2.c:
int a;
int g () {return f ();}
По-перше, file2. c не C++, тому що f () не була описана, і тому компілятор буде незадоволений. По-друге, (коли file2.c фіксований) програма не буде скомпонована, оскільки a визначене двічі. Ім'я можна зробити локальним в файлі, описавши його static. Наприклад: