“;重新定义';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)