adressmoeistranici
@adressmoeistranici
Делатель

Как использовать одно состояние переменных заголовочного файла в нескольких исходных файлах программы?

У меня есть заголовочный файл с переменными, типами, прототипами и функциями.
Как использовать его в нескольких исходных файлах сишной программы?
Получается что препроцессор будет разворачивать содержимое в каждый исходный файл определяющий инклуд на данный заголовок?
если я убераю из второго файла инклуд то получаю отсутствие определений, а если оставляю то получаю ошибку того что эти определения уже есть в первом файле.
Как правильно настроить компилятор для того чтобы он из обращений второго файла шел к определениям подстановки инклуда в первом. Грубо говоря чтобы эти определения были общими для обоих файлов.
  • Вопрос задан
  • 271 просмотр
Решения вопроса 3
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Я так понял, проблема именно с глобальными переменными?

В хедере объявляете переменную как extern, в одном c файле определяете ее с инициализацией без extern - тогда все работает.
Ответ написан
Комментировать
@Fatus
Инженер-электроник
Защита заголовков. Ваши определения функций и определений типов не должны объявляться дважды. Поэтому не забывайте про защиту включения: старый способ #ifndef #define #endif или прагмой #pragma once. Но думаю Вы итак это используете, а проблема именно в переменных.
Если вы объявляете переменную в заголовочном файле (не надо так) т.е. вне функции - переменная является статической и область видимости такой переменной - файл, но вы хотите через .h файл сделать видимой статическую переменную с областью видимости файл в разных файлах. Переменные не объявляются в .h файлах.
Решение: статические переменные объявляются в .с файле. Если вы хотите ограничить область видимости до файла, используете static. А вот если вы хотите расширить область видимости до проекта, то в файле, где вы хотите использовать объявленную в другом месте переменную, используйте ключевое слово extern. Иными словами - объявили в .с файле статическую переменную (int x;) создали .h файл и там указали extern int x; и теперь вы можете добавлять свой .h файл и переменная x будет обладать внешней компоновкой, и из всех .с файлах вы будете обращаться к одной статической переменной х (которая объявлена и инициализирована один раз в .с файле, но никак в .h)
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Стоит знать, что #pragma once не стандартная директива. Ее наличие зависит от компилятора. В популярных компиляторах актуальных версий она поддерживается.
Include guards - универсальный стандартный механизм, основанный на препроцессоре Си, поддерживается всеми компиляторами Си с лохматых времен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
includedlibrary
@includedlibrary
#pragma once
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы