“重新定义'foo'作为不同类型的符号”

时间:2011-03-04 08:48:56

标签: c types typedef identifier redefinition

我正在尝试重构并带来一些旧代码,我碰到了这样的事情:

          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类型冲突?

编辑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 个答案:

答案 0 :(得分:2)

您现在正在将其编译为C ++,而它曾经被编译为C吗?

在C ++中,struct和enum标记与其他类型名称位于同一名称空间中。

答案 1 :(得分:2)

啊,我解决了自己的问题。我设法搞砸了我的e()宏,因此它实际上是在形成一个noop,删除了有问题的代码。 :o

我是个白痴。很抱歉浪费每个人的时间。

答案 2 :(得分:0)

将名称foo与两种不同的类型相关联。 struct foo和指向struct foo的指针是不同的类型。

答案 3 :(得分:-1)

这是合法的C,但不是合法的C ++。您是否有机会尝试使用C ++编译器进行编译?我的gcc可以完美地编译你的代码。