«Переопределение« foo »как символа другого типа» - PullRequest
3 голосов
/ 04 марта 2011

Я пытаюсь реорганизовать и перенести какой-то старый код, и я наткнулся на что-то вроде этого:

          struct foo;
typedef   struct foo *    foo;

При попытке его скомпилировать я получаю следующую ошибку:

Source/Types/Types.h:27:18: error: redefinition of 'foo' as different kind of symbol
typedef   struct foo *    foo;
                 ^

Кто-нибудь знает, что вызывает это?Я давно не касался кода, но я, конечно, не помню никаких ошибок, связанных с этим.Это один из самых основных кодов в кодовой базе, все зависит от него;Я не понимаю, как я мог пропустить такую ​​явную ошибку, если это действительно ошибка.Поскольку исходный foo является «структурным тегом» (только нормальная ссылка после ключевого слова struct), как он может конфликтовать с моим новым foo typedef'd типом?

Редактировать1: Вот весь фактический файл, возможно, я что-то упустил, но это кажется довольно простым.Он сбрасывает slew тех же ошибок, описанных выше, по одной для каждого типа:

# if !defined(TYPE_DECLARATIONS)
#   define    TYPE_DECLARATIONS

# include "Core.h"
# warning "in Core.h"

static int class = 0; // to prove I’m not compiling as C++

          struct e(fork);
typedef   struct e(fork)*                 e(fork);

          struct e(execution);
typedef   struct e(execution)*            e(execution);


          struct e(thing);
typedef   struct e(thing)                 e(thing);

          struct e(typeRepresentation);
typedef   struct e(typeRepresentation)*   e(typeRepresentation);


struct e(typeRepresentation) {
  void *                      family;
  char                        name[64]; };

struct e(thing) {
  void * const                pointer;
e(typeRepresentation) const   isa; };


# endif //!defined(TYPE_DECLARATIONS)

(Кроме того, игнорируйте макрос e(); в данном случае это noop.)

Ответы [ 4 ]

2 голосов
/ 04 марта 2011

Ах, я решил свою проблему.Мне удалось испортить мой макрос e() так, чтобы он буквально формировал noop, удаляя соответствующий код.: O

Я идиот.Извините за трату времени всех.

2 голосов
/ 04 марта 2011

Вы сейчас компилируете это как C ++, тогда как раньше это компилировали как C?

В C ++ теги struct и enum находятся в том же пространстве имен, что и имена других типов.

0 голосов
/ 04 марта 2011

вы связываете имя foo с двумя разными типами. struct foo и указатель на struct foo - это разные типы.

0 голосов
/ 04 марта 2011

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

...