Проверка, когда два заголовка включены одновременно - PullRequest
2 голосов
/ 14 мая 2010

Мне нужно сделать утверждение на основе двух связанных макропроцессоров #define, объявленных в разных заголовочных файлах ... База кода огромна, и было бы неплохо, если бы я мог найти место для размещения утверждения, где два заголовки уже включены, чтобы избежать ненужного загрязнения пространств имен.

Проверка только того, что файл включает оба явно, может оказаться недостаточной, поскольку один (или оба) из них могут быть включены в верхний уровень иерархии вложенного включения.

Я знаю, что было бы не сложно написать скрипт, чтобы проверить это, но если уже есть инструмент, который делает эту работу, тем лучше.

Пример:

файл foo.h

#define FOO 0xf

файл bar.h

#define BAR 0x1e

Мне нужно положить куда-нибудь (где это не имеет большого значения) что-то вроде этого:

#if (2*FOO) != BAR
    #error "foo is not twice bar"
#endif

Да, я знаю, что пример глупый, так как их можно заменить, так что одно получается из другого, но допустим, что включения могут быть сгенерированы из разных мест, не находящихся под моим контролем, и мне просто нужно проверить, совпадают ли они во время компиляции ... И я не хочу просто добавлять одно включение за другим, так как оно может конфликтовать с предыдущим кодом, который я не написал, поэтому я хотел бы найти файл, в котором оба уже присутствуют .

Вкратце: как найти файл, который включает (прямо или косвенно) два других файла?

Ответы [ 3 ]

1 голос
/ 14 мая 2010

Поскольку оба ваших включения, вероятно, защищены защитой #define, вы можете проверить в каждом из этих двух файлов заголовков, включен ли другой файл на основе #ifdef THE_OTHER_GUARD_NAME, и выдать предупреждение (или ошибку, в зависимости от того, что вы предпочитаете) если вы обнаружили это включено.

1 голос
/ 14 мая 2010

Если вы работаете в Unix или подобной Unix системе, есть утилита под названием makedepend, которую вы можете использовать.

http://en.wikipedia.org/wiki/Makedepend

Если вы работаете в Windows, есть проект Sourceforge под названием makedep, который может работать.

0 голосов
/ 14 мая 2010

А как насчет # прагмы один раз оператора? После этого вы можете забыть беспокоиться об умножении определений заголовочных файлов ...

...