C конфликт имен typedef

Я получил 2 файла заголовка, которые я включаю, что оба имеют typedef с тем же именем.

скажем aaa.h и bbb.h. Они пришли из 2 несвязанных пакетов 3rd party, и я не контролирую эти файлы 2, но должен их использовать. Я не включаю оба файла напрямую, но они скорее включены в заголовочный файл верхнего уровня. (т. Я включаю А. h И b.h которые соответственно включали их)

моя программа не будет компилироваться, когда они оба включены из-за имени конфликт.

поэтому мое временное решение-я скопировал aaa.h в мое исходное дерево с удаленным только typedef, называемым myaaa.h. В верхней части файла я сохраняю оболочку "#ifndef AAA_H, #define AAA_H " неповрежденной, поэтому, когда я включаю myaaa.h, aaa.h не будет включен, поскольку флаг AAA_H уже определен, косвенно удален конфликт typedef.

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

спасибо!

1 ответов


#define conflicting_typedef aaa_conflicting_typedef
#include "aaa.h"
#undef  conflicting_typedef
#define conflicting_typedef bbb_conflicting_typedef
#include "bbb.h"
#undef  conflicting_typedef
#define conflicting_typedef ambiguous use aaa_conflicting_typedef or bbb_conflicting_typedef

Если вам нужно обратиться к typedef С aaa.h, вы можете использовать имя aaa_conflicting_typedef; для обозначения typedef С bbb.h имя bbb_conflicting_typedef. Если (как, вероятно, и происходит) вам не нужно ссылаться ни на typedef в вашем коде, то вы хорошо идти. Финал #define гарантирует, что вы не используете простое имя; вы должны использовать правильное сопоставленное имя.

ясно, что это не должно повторяться; если есть более одного файла, который нуждается в этой строфе, вы ставите это в ваш собственный заголовок " aaa_bbb.h " и включите это там, где вам нужна строфа. Вы даже можете определить, является ли либо aaa.h или bbb.h уже включен и отклоняет компиляцию, если она есть (вы не можете определить, включены ли они после этого, но тот факт, что они были включены один раз под вашим контролем, означает, что они не должны быть включены снова).

если бы это был C++, у вас была бы большая проблема из-за безопасной связи. OTOH, поставщики библиотеки тогда оба виновны неправильного контроля пространства имен.