错误:在Linux上编译Objective-C时重新定义“struct StructName”消息

我正在尝试在Ubuntu 12 Linux上编译Objective-C代码。

main.m看起来像这样:

#import <Foundation/Foundation.h> #import "CEFoo/CEFoo.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"hello world"); [pool drain]; return 0; } 

在CEFoo.h中,我有这样的定义:

 struct StructName{ // line 86 BOOL first; ... ... }; @interface StructName :NSObject // line 92 BOOL first; // line 93 ... ... @end // 96 

当我去编译

 gcc main.m `gnustep-config --objc-flags` -lgnustep-base -o main.bin 

我得到这个消息:

 Foo/CEFoo.h:93:1: error: redefinition of 'struct StructName' Foo/CEFoo.h:86:8: note: originally defined here 

我读过这可能是由两次重新定义结构造成的,或者在使用include而不是import时recursion导入。

 grep -r "struct StructName" * 

只显示定义的一个事件。

我也search了项目中的每个包含语句,并且没有发现include和import的明显用法,或者是CEFoo.h的双重包含/导入(包含多次定义/导入的结构的文件) 。

我怎样才能进一步追捕这件事? 我假定我导入了两次 – 如果我是,有没有办法通过首次定义的详细或日志来观看它?

任何其他的想法,我可以做什么来解决这个问题?

TIA

定义一个类意味着为其创建一个结构体。 而且你碰巧有一个和你的类完全一样的结构。 例如,请查看http://ideone.com/7kvFa上的以下代码:“live&#x201D;

 #import <objc/objc.h> struct name {}; @interface name @end int main() { return 0; } 

这是因为GCC处理Objective-C对象的方式。 GCC(在版本4.2.1;我不知道更多的最新版本)将对象视为指向不透明结构的指针。

当你声明一个名为StructName的类时,GCC隐含地执行以下操作:

  struct StructName;
 typedef struct StructName StructName; 

当您尝试使用NSString对象指针初始化一个NSArray对象指针时,您可以看到该行为:

  NSArray * array = @“Hello world”; 

GCC发出以下警告:

 警告:不兼容的Objective-C类型初始化'struct NSString *',期望的'struct NSArray *' 

所以,即使你仅仅声明了一次struct StructName ,GCC struct StructName看到两个声明,并且因为这个原因无法编译这个文件。

我建议你重命名你的结构或使用另一个编译器(如LLVM)。