Ключове слово extern у C застосовується до змінних C (об’єктів даних) і функцій C. По суті, ключове слово extern розширює видимість змінних C і функцій C. Ймовірно, тому його назвали екстерном.
Хоча більшість людей, мабуть, розуміють різницю між оголошенням і визначенням змінної чи функції, для повноти картини давайте це роз’яснимо.
- Оголошення змінної або функції просто оголошує, що змінна або функція існує десь у програмі, але пам’ять для них не виділена. Оголошення змінної або функції відіграє важливу роль – воно повідомляє програмі, яким буде її тип. У випадку функція декларацій, він також повідомляє програмі аргументи, їхні типи даних, порядок цих аргументів і тип повернення функції. Ось і все про декларацію.
- Прийшовши до визначення , коли ми визначити змінна або функція, на додаток до всього, що робить оголошення, вона також виділяє пам'ять для цієї змінної або функції. Тому ми можемо розглядати визначення як надмножину оголошення (або оголошення як підмножину визначення).
- Зовнішній - це коротка назва для зовнішнього.
- Зовнішня змінна використовується, коли певним файлам потрібен доступ до змінної з іншого файлу.
Синтаксис extern у C
Синтаксис для визначення змінної extern у C полягає у використанні ключового слова extern перед оголошенням змінної.
extern data_type variable_name;>
Приклад зовнішньої змінної в C
C
#include> > extern> int> a;>// int var; ->оголошення та визначення>>> > int> main()> {> >printf>(>'%d'>, a);> > >return> 0;> }> |
>
>
Властивості зовнішньої змінної в C
- Коли ми пишемо extern some_data_type some_variable_name; пам'ять не виділена. Оголошується лише властивість змінної.
- У файлі дозволено кілька декларацій зовнішньої змінної. Це не стосується автоматичних змінних.
- Зовнішня змінна каже компілятору Вийдіть за межі моєї області, і ви знайдете визначення змінної, яку я оголосив.
- Компілятор вважає, що все, що сказала ця зовнішня змінна, є істинним і не створює помилок. Компонувальник видає помилку, коли виявляє, що така змінна не існує.
- Коли зовнішня змінна ініціалізована, для неї виділяється пам’ять, і вона вважатиметься визначеною.
Змінна або функція може бути заявлено будь-яку кількість разів, але це може бути визначений тільки один раз. (Пам’ятайте основний принцип, що ви не можете мати два розташування однієї змінної чи функції).
Тепер повернемося до ключового слова extern. Спочатку розглянемо використання extern у функціях. Виявляється, коли функція оголошується або визначається, ключове слово extern неявно передбачається. Коли ми пишемо.
int foo(int arg1, char arg2);>
Компілятор розглядає це як:
як знайти заблоковані номери на android
extern int foo(int arg1, char arg2);>
Оскільки ключове слово extern розширює видимість функції для всієї програми, функція може бути використана (викликана) будь-де в будь-якому з файлів усієї програми, за умови, що ці файли містять оголошення функції. (З оголошенням функції на місці компілятор знає, що визначення функції існує десь ще, і він йде вперед і компілює файл). Отже, це все про екстерн і функції.
Тепер давайте розглянемо використання extern зі змінними. Для початку, як би ви заявляти змінна без визначальний це? Ви б зробили щось на зразок цього:
extern int var;>
Тут оголошено змінну цілого типу під назвою var (її ще не визначено, тому для var поки що не виділено пам’ять). І ми можемо робити цю декларацію скільки завгодно разів.
Тепер, як би ви визначити var? Ви б зробили це:
int var = 10;>
У цьому рядку оголошено змінну цілого типу під назвою var і визначено (пам'ятайте, що визначення є надмножиною декларація ). Оскільки це a визначення , також виділяється пам’ять для вар. А тепер сюрприз. Коли ми оголосили/визначили функцію, ми побачили, що ключове слово extern присутнє неявно. Але це не стосується змінних. Якби це було так, пам'ять ніколи б не була виділена для них. Тому нам потрібно явно включити ключове слово extern, коли ми хочемо оголосити змінні, не визначаючи їх. Крім того, оскільки ключове слово extern розширює видимість усієї програми, використовуючи ключове слово extern зі змінною, ми можемо використовувати змінну будь-де в програмі, якщо ми включимо її оголошення, змінна десь визначена.
Тепер спробуємо розібратися в extern на прикладах.
Приклад 1:
в
windows.open javascript
int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Ця програма успішно компілюється. var визначається (і оголошується неявно) глобально.
приклад 2:
в
js onclick
extern> int> var;> int> main(>void>)> {> >return> 0;> }> |
>
>
Ця програма успішно компілюється. Тут оголошується лише var. Зауважте, що змінна ніколи не використовується, тому проблем не виникає.
приклад 3:
в
extern> int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Ця програма видає помилку під час компіляції (під час фази зв’язування, більше інформації тут), оскільки var оголошено, але ніде не визначено. По суті, змінній не виділяється пам’ять. І програма намагається змінити значення змінної, якої взагалі не існує, на 10.
Приклад 4:
в
java сортує список масивів
// As we are importing the file and henceforth the> // defination> #include 'somefile.h'> > // Declaring the same variable> extern> int> var;> >// int var;> >// It will throw compiler error as compiler will get> >// confused where the variable is defined> > int> main(>void>)> {> >var = 10;> >return> 0;> }> > // Now it will compile and run successfully> |
>
>
Вихід:
10>
Примітка: Тут виникає інший сценарій, що якщо ми не оголосимо extern у наведеному вище фрагменті коду?
Враховуючи припущення, що somefile.h містить визначення var, ця програма буде успішно скомпільована. Ключове слово extern використовується для змінної, коли ми оголошуємо змінну в одному файлі та визначаємо її в іншому файлі. Але тут, коли ми імпортуємо той самий файл у файл, де він оголошений, тут буде згенерована помилка компілятора.
Це тому, що ми все ще повинні використовувати ключове слово extern у файлі, де ми оголосили цю змінну, щоб повідомити нашому компілятору, що ця змінна була визначена десь в іншому місці, ніж тільки новий простір пам’яті не буде виділено, інакше буде створено інший блок пам’яті яке використання ключового слова 'extern' марне.
Приклад 5:
в
як центрувати зображення на css
extern> int> var = 0;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Як ви думаєте, ця програма працюватиме? Що ж, ось ще один сюрприз від стандартів C. Кажуть, що.. якщо змінну лише оголошено, а ініціалізатор також надано разом із цією декларацією, то пам’ять для цієї змінної буде виділено, іншими словами, ця змінна вважатиметься визначеною. Тому, згідно зі стандартом C, ця програма буде успішно скомпільована та працюватиме.
Отже, це був попередній погляд на ключове слово extern у C.
Коротко можна сказати:
- Оголошення можна робити будь-яку кількість разів, але визначати лише один раз.
- Ключове слово extern використовується для розширення видимості змінних/функцій.
- Оскільки функції видимі у всій програмі за замовчуванням, використання extern не потрібне в оголошеннях чи визначеннях функцій. Його використання неявне.
- Коли extern використовується зі змінною, вона лише оголошується, а не визначається.
- Як виняток, коли зовнішня змінна оголошується з ініціалізацією, вона також береться як визначення змінної.