Какой стандартный способ исправить конфликтующие типы из разных библиотек в C? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь включить сторонние библиотеки в файл .c , но он выдает либо переопределение , либо конфликтующие типы , поскольку он имеет typedef сто же имя.

Я попытался включить охрану после прочтения некоторых ответов здесь в SO и, очевидно, непосредственное изменение typedef в файле .h решило проблему.

например, (Также необходимо изменить тип возвращаемого значения функции)

// stack.h
typedef struct item stack_item;

// queue.h
typedef struct item queue_item;

Однако оригинальный код выглядит следующим образом:

// stack.h
typedef struct item item;

// queue.h
typedef struct item item;

Выдает следующееошибка:

In file included from test.c:5:0:
Queues/queue.c:6:8: error: redefinition of ‘struct item’
 struct item {
        ^

In file included from Stacks/stack.c:4:0, from test.c:4:
Stacks/stack.h:6:16: note: originally defined here
 typedef struct item item;
                ^

Я хотел бы знать, что является стандартным способом решения этой проблемы, вместо изменения определений в файле .h

1 Ответ

0 голосов
/ 19 декабря 2018

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В случае, если это не работает, вы также можете рассмотреть возможность выполнения эквивалентных правок вручную для создания локальных версий заголовков для использования только вашим проектом.Это позволит вам быть более точным в отношении того, что изменяется, но использование этих заголовков по-прежнему страдает от проблем соответствия, описанных выше.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...