Циклы включения в заголовочных файлах C - PullRequest
1 голос
/ 08 ноября 2008

Как можно предотвратить цикл включения в C? то есть. Вы не должны иметь a.h #include "b.h", который # include будет "c.h", а # include будет "a.h" Я ищу способ предотвратить это, используя какую-то директиву C.

Я изначально думал, что это предотвратило бы это:

Содержание a.h:

#ifndef __A_H
#define __A_H

#include "b.h"

#endif // __A_H

Содержание б.ч:

#ifndef __B_H
#define __B_H

#include "c.h"

#endif // __B_H

Содержание c.h:

#ifndef __C_H
#define __C_H

#include "a.h"

#endif // __C_H

Но, похоже, это не работает.

Ответы [ 5 ]

7 голосов
/ 08 ноября 2008

Это работает нормально: файлы многократно включены, но разделы, защищенные # ifdndef / # define / # endif , не повторяются , и это прерывает цикл.

Используйте ваш компилятор для получения предварительно обработанного вывода и посмотрите на него сами. В GNU CC вам нужно использовать опцию «-E» в файле .c [pp], например:

gcc -E $(CFLAGS) -o foo.i foo.cpp
1 голос
/ 12 ноября 2008

да, в дополнение к вышеперечисленным вещам, если вы работаете над Turbo C и выполняете проект с этими исходными файлами, тогда не прикрепляйте заголовочные файлы, которые #include в исходных файлах. И даже если это не так работая, попробуйте это из командной строки, потому что некоторые опции компилятора выдают эти ошибки снова и снова. поэтому здесь, если содержимое заголовочных файлов находится между #ifndef и #endif, тогда не будет никаких проблем, даже если вы включите оба файла. Поэтому попробуйте удалить заголовочные файлы из проекта, сохранив их в той же директории. Bcos, у которой не указана среда, я указал Turbo C, потому что однажды я столкнулся с такой ситуацией на Turbo C с заголовочными файлами #include в исходном файле и прикрепленными к списку файлов проекта. тогда возникнет «проблема множественного объявления». Также после компиляции (даже с ошибками) перейдите во внешнюю командную строку и перейдите в каталог, где хранится этот файл, и попробуйте напрямую с именем filename.exe .ok

1 голос
/ 08 ноября 2008

Это должно работать. Это правильно написано в вашем примере и хорошо компилируется для меня. Вы что-то неправильно набрали в своем коде или это действительно другая проблема, с которой вы столкнулись?

Вы не должны начинать все с __, поскольку это зарезервировано для компилятора и / или системных библиотек. Попробуйте другие имена для ваших охранников.

1 голос
/ 08 ноября 2008

Макросы с ведущими символами подчеркивания зарезервированы для препроцессора / компилятора.

Попробуйте изменить __ * _ H на что-то более стандартное.
Я использую ЕСТЬ __ * _ H.

0 голосов
/ 08 ноября 2008

Это работает.

Просто чтобы быть уверенным, я фактически скомпилировал test.c, который включал a.h с вашими 3 заголовочными файлами.

Я подтвердил, что это работает для нескольких версий MSVC, Digital Mars и GCC.

...