C имеет только одно пространство имен для тегов структуры, которое также содержит теги объединений и перечислений.Вы не можете использовать два разных типа структуры с одним и тем же тегом в одной и той же области видимости.Существует другое пространство имен, которое содержит, помимо прочего, typedef
ed идентификаторов, но, опять же, одно имя типа может означать только одну вещь в любой заданной области.
Однако на практике имена структур имеют значение только привремя компиляции.Если вы используете упакованные, предварительно скомпилированные версии сторонних библиотек, то, вероятно, все, что вам нужно беспокоиться, это заголовки.Вы могли бы иметь возможность использовать препроцессор для изменения одного или обоих тегов в рамках единиц перевода вашей программы.Например,
#define item stack_item
#include <stack.h>
#undef item
#define item queue_item
#include <queue.h>
#undef item
Ваш код будет использовать struct stack_item
и / или typedef stack_item
для одного и struct queue_item
и / или queue_item
для другого.Имейте в виду, что существует риск того, что эффект будет более широким, чем вы хотите - например, изменение имен членов структуры.Кроме того, хотя он имеет хорошие шансы на работу, он технически не соответствует вызову любых функций, которые имеют параметры или возвращаемые типы, полученные из или содержащие экземпляры исходных типов структуры (с некоторыми оговорками).
InВ случае, если это не работает, вы также можете рассмотреть возможность выполнения эквивалентных правок вручную для создания локальных версий заголовков для использования только вашим проектом.Это позволит вам быть более точным в отношении того, что изменяется, но использование этих заголовков по-прежнему страдает от проблем соответствия, описанных выше.
Если вы должны использовать обе библиотеки в одном и том же модуле перевода, и вы хотите, чтобы вашкод соответствует стандарту, тогда вам не повезло.Единственная альтернатива , соответствующая , заключается в изменении и перестройке одной или обеих библиотек, чтобы они больше не сталкивались с именами.