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

“;重新定义';foo';作为不同类型的符号”;,c,types,typedef,identifier,redefinition,C,Types,Typedef,Identifier,Redefinition,我正在尝试重构并引入一些旧代码,我遇到了如下情况: struct foo; typedef struct foo * foo; 在尝试编译时,我会遇到以下错误: 有人知道这是什么原因吗?我已经很久没有接触过代码了,但我肯定不记得有任何与此相关的错误。它是代码库中最核心的代码,一切都取决于它;如果这确实是一个错误的话,我不明白我怎么会错过这样一个明显的错误。由于原始的foo是一个“结构标记”(仅在struct关键字之后是一个正常的引用),它如何与我的新footype

我正在尝试重构并引入一些旧代码,我遇到了如下情况:

          struct foo;
typedef   struct foo *    foo;
在尝试编译时,我会遇到以下错误:

有人知道这是什么原因吗?我已经很久没有接触过代码了,但我肯定不记得有任何与此相关的错误。它是代码库中最核心的代码,一切都取决于它;如果这确实是一个错误的话,我不明白我怎么会错过这样一个明显的错误。由于原始的
foo
是一个“结构标记”(仅在
struct
关键字之后是一个正常的引用),它如何与我的新
foo
typedef'd类型冲突

编辑1:这是整个实际文件,也许我遗漏了什么,但看起来很简单。它转储一系列上述相同错误,每种类型一个:

# 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。在这里,

< P>你现在编译为C++,而它被编译成C?
在C++中,Strut和Enm标签与其他类型名称同住在同一命名空间中。p> 将名称foo与两种不同的类型相关联。struct foo和指向struct foo的指针是不同的类型。

啊,我解决了自己的问题。我设法搞乱了我的
e()
宏,这样它实际上是在执行一个noop,删除了有问题的代码:O


我是个白痴。很抱歉浪费了大家的时间。

那段代码编译起来对我来说没问题。你在用什么编译器?我使用的是GCC4.3.3,看起来您正试图编译为
C++
。尝试添加
int类合适的地方,并检查编译器是否抱怨:)
static int class=0在全局范围内,在其他代码产生新错误之前,这听起来像是完美的解释,但我不是。我希望这很容易)-(我用的是<代码> CLAN-STD= C99 -学究错误-墙-O0…<代码>)SBI,C++中没有,这比这更复杂。如果没有具有该名称的其他标识符(类型、函数、变量…),则可以将
struct
union
enum
标记用作不带关键字的类型。@sbi:不完全。最初给出的代码不是正确的C++,因为它的代码< TyPulf>代码>语义不同于<代码>结构Foo。但你的第二句话是错的。例如
structfoo;foo*foo有效C++,无效于C.<代码> SCORT FO FO;结构foo*foo对这两种情况都有效<代码>类型定义结构foo foo也是。但是
typedef结构foo-foo;foo*foo对这两个都无效。@Jens:我明白了。我没有考虑过这些。这个固定语句现在正确了吗?@sbi,hm,type和其他标识符位于同一个名称空间中,这里没有传递性。。。“C++”中,“结构”和“枚举”标签可以用作类型名称,如果没有歧义的话,或者类似的东西。但无论如何,没有多少机会有人会研究这个现在已经过时的问题。
# 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)