【问题标题】:Error with including files包含文件时出错
【发布时间】:2012-02-03 08:23:05
【问题描述】:

我有一个类结构

Class A
{
   Object of classB
   Object of classC
}

现在为此我有文件 A.h/A.m B.h/B.m , C.h/C.m 现在我有一个单独的文件 G.h,它有许多全局变量,所有 A、B、C 类都使用这些变量 现在我已经在 A.h 中导入了 B.h 、 C.h 、 G.h 。我还分别在 B.h 和 C.h 中导入了文件 G.h

现在在构建项目时,我收到全局变量上重复符号的链接错误(这可能是由于文件 G.h 的多次包含)。

我该如何解决这个问题???以下是我的代码结构

//A.h

#import "B.h"
#import "C.h"
#import "G.h"

@interface A : NSObject {
  B *b;
  C *c;
}
//B.h
#import "G.h"

//C.h

#import "G.h"

//G.h
A *a=nil;
@interface G : NSObject { //whole class is empty}

【问题讨论】:

    标签: objective-c cocoa oop class import


    【解决方案1】:

    您应该在G.h声明您的全局变量,但在G.m定义它们,以便它们只在目标中链接一次。因此,例如,如果你有一个全局定义的字符串常量,你会这样做:

    G.h

    extern NSString const *appName;
    

    G.m

    NSString const *appName = @"My Great App";
    

    在您粘贴的代码中,复制的是 A 实例。它被导入到彼此的翻译单元中,但每次都使用相同的名称,这意味着编译的对象无法链接。假设您想要一个名为 a 的共享 A 实例,您可以这样做:

    G.h

    @class A;
    extern A *a;
    

    G.m

    #import "A.h"
    #import "G.h"
    
    A *a = nil;
    

    【讨论】:

    • 非常感谢..确实犯了一个非常根本的错误
    【解决方案2】:

    在您的类头文件中使用@class 编译器指令,而不是导入其他类的头文件。 @class 提供给定类的前向声明,因此您可以推迟导入它的头文件,直到您真正需要它,它通常位于相应的.m 文件中。

    所以不要像这样:

     #import "B.h"
    
     @interface A : NSObject
     {
         B someObj;
     } 
    

    ...这样做

     @class B;
    
     @interface A : NSObject
     {
         B someObj;
     } 
    

    现在编译器将理解B 是一个类的名称,因此允许您将其用作数据类型而无需导入B 的标头。

    【讨论】:

      猜你喜欢
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多