Якщо у мене є файл C, як показано нижче, в чому різниця між i
і j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
Якщо у мене є файл C, як показано нижче, в чому різниця між i
і j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
Відповіді:
i
має внутрішнє зв’язування, тому ви не можете використовувати ім’я i
в інших вихідних файлах (строго одиницях перекладу) для посилання на той самий об’єкт.
j
має зовнішню зв'язок, тому ви можете використовувати j
для посилання на цей об'єкт, якщо заявляєте про це extern
в іншій одиниці перекладу.
i
не видно за межами модуля; j
доступна у всьому світі.
Тобто інший модуль, який зв’язаний з ним, може зробити
extern int j;
а потім мати можливість читати та записувати значення в j
. Той самий інший модуль не може отримати доступ i
, але може оголосити свій власний екземпляр, навіть глобальний - який не видно першому модулю.
extern
гарантовано не викликає проблем, якщо один модуль має символ як не- extern
і громадськості (що виділяє його). Ранні реалізації Unix об’єднували символи з однойменною назвою - майже як Фортран, - тому extern
не вимагалося.
i
матиме статичну зв'язок , тобто змінна доступна лише у поточному файлі.
j
слід визначати як extern
, тобто
extern int j;
в іншому файлі заголовка ( .h
), і тоді він матиме зовнішнє зв’язування , і до нього можна отримати доступ через файли.
Область дії статичної змінної / функції знаходиться в одному файлі, незважаючи на те, що ви включили файл як частину іншого вихідного файлу.
Сфера дії глобальної змінної знаходиться у всіх файлах, до яких вона включена. Щоб включити змінну в інший вихідний файл, ми використовуємо extern
перед оголошенням змінної. У цьому випадку для змінної знову не виділяється пам’ять.
extern
використовується для оголошення змінної C без її визначення. extern
Ключове слово розширює видимість змінних C та функцій C. Оскільки функції за замовчуванням видно через програму, використання extern
в декларації / визначенні функції не потрібне. Його використання зайве.