Typedef структура указатель с тем же именем в C ++ - PullRequest
0 голосов
/ 22 февраля 2019

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

typedef struct SequenceOfUint8 {        // Line 69
    struct SequenceOfUint8 *next;
    Uint8           value;
    } *SequenceOfUint8;                 // Line 72

Если я включу этот файл заголовка в код C (компилятор gcc), он прекрасно скомпилируется без ошибок, но если попытаться включить его в CPPкод, компилятор g ++ выдает ниже упомянутую ошибку.

In file included from ssme/src/../include/xxxxx.h:39:0,
                 from ssme/src/ssme.cpp:11:
ssme/src/../include/yyyyy.h:72:4: error: conflicting declaration ‘typedef struct SequenceOfUint8* SequenceOfUint8’
 } *SequenceOfUint8;
    ^~~~~~~~~~~~~~~
ssme/src/../include/yyyyy.h:69:16: note: previous declaration as ‘struct SequenceOfUint8’
 typedef struct SequenceOfUint8 {
                ^~~~~~~~~~~~~~~

Может кто-нибудь подсказать, как использовать это в коде C ++ (если это возможно, без изменения автоматически сгенерированного кода).

PS: Iвключил заголовочный файл в файл CPP, используя оператор extern "C" { #include "yyyy.h" }, но все равно не повезло.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Вы не можете использовать его как в коде C ++.Это еще один случай, когда C и C ++ являются двумя различными языками.

Пространство имен тегов в C является отдельным, в C ++ - нет.Точнее, он даже не существует в C ++.

Обтекание в extern "C" также не заставит компилятор C ++ рассматривать заголовок как код C.Это не предназначенная функция.Заголовок должен быть действительным автономным C ++, а это просто не так.

Вам нужно написать оболочку C, которая предоставляет C ++-совместимый API.

0 голосов
/ 22 февраля 2019

Отказ от ответственности: используйте этот ответ на свой страх и риск.Я не твоя мама.

Предположим, что:

  • Вы не можете изменить сгенерированный код вообще
  • Нет другого использования typedefвнутри сгенерированного файла
  • Вы не боитесь прагматичного неопределенного поведения

// <Your lenghty apologetic comment here>
#define typedef static

#include <generated.h>

#undef typedef

Это заменит все typedef с static переменных, которые могут скрывать типы.Обратите внимание, что вам нужно будет использовать разработанное имя типа struct SequenceOfUint8, чтобы ссылаться на типы позже в том же файле.

0 голосов
/ 22 февраля 2019

Это скорее замечание, чем ответ, но не практично делать это как замечание

К сожалению, если вы находитесь в C ++, просто замените его на

struct SequenceOfUint8 {        // Line 69
   SequenceOfUint8 *next;
   Uint8           value;
};

иначе использовать typedef как обычно в C, но не делать typedef для SequenceOfUint8 *, чтобы сделать typedef , чтобы скрыть указатель, катастрофически для читабельностикода, и в вашем случае это было хуже, потому что имя то же самое

...