спільні глобальні змінні в C


82

Як я можу створити глобальні змінні, які спільно використовуються в C? Якщо я поміщу його у файл заголовка, тоді компоновник скаржиться, що змінні вже визначені. Чи єдиний спосіб оголосити змінну в одному з моїх файлів C та вручну поставити externs у верхній частині всіх інших файлів C, які хочуть її використовувати? Це звучить не ідеально.


Спільний доступ у вашому власному вихідному коді? Помістіть декларацію extern в один файл заголовка, а визначення - в інше (єдине) джерело. Звичайно, вони поділяються між вашими потоками процесів. Для обміну даними між процесами використовуйте механізми IPC (спільна пам’ять, канали).
Ернан,



Відповіді:


64

У файлі заголовка напишіть це за допомогою extern. І в глобальному масштабі один із файлів c оголошує це без extern.


1
Чи можемо ми оголосити це у цьому заголовному файлі * .c?
Геремія

91

В одному файлі заголовка (shared.h):

У кожен файл, який ви хочете використовувати цей глобальний символ, включіть заголовок, що містить декларацію extern:

Щоб уникнути декількох визначень посилання, у ваших одиницях компіляції має бути лише одне оголошення вашого глобального символу (наприклад: shared.cpp):


чи є у вас бажані посилання, щоб дізнатись більше про механізми IPC?
NickO

7
Будь ласка, зробіть більше уваги на "лише одній декларації вашого глобального символу ..." У мене була декларація щодо всіх c-файлів, на яких я хотів використовувати глобальні змінні :(
AntonioCS

22

У файлі заголовка

файл заголовка

У файлі з файлом, який ви хочете жити глобально:

В інших файлах, які потребують зовнішньої версії:


ах, це рішення, яке я мав деякий час тому - я забув про змінну препроцесора MAIN_FILE. Мені подобається, що мені більше подобається прийнята відповідь
Клавдіу

15

Ви поміщаєте декларацію у файл заголовка, наприклад

В одному з ваших .c-файлів ви визначаєте його в глобальному масштабі.

Кожен файл .c, до якого потрібно отримати доступ, my_globalвключає файл заголовка з вхідним файлом extern.


5

Якщо ви використовуєте код між C і C ++, не забудьте додати до shared.hфайлу таке:


2

Існує більш чистий спосіб лише з одним заголовком, тому його простіше підтримувати. У заголовку з глобальними змінними префікс кожної декларації має ключове слово (я використовую загальне), тоді лише в одному вихідному файлі включіть його так

та будь-які інші вихідні файли, подібні до цього

Просто переконайтеся, що ви не ініціалізуєте жодну зі змінних у файлі globals.h, інакше компоновник все одно скаржиться, оскільки ініціалізована змінна не розглядається як зовнішня навіть за ключовим словом extern. Файл global.h виглядає подібним до цього

здається, працює для будь-якого типу декларації. Не використовуйте звичайне ключове слово на #define, звичайно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.