重复的协议定义警告

时间:2015-11-05 14:33:43

标签: objective-c llvm llvm-clang

首先,我看到this question以及this,但我的问题没有在那里解决。

我在自己的头文件中定义了一个协议ClassA。然后我有两个类ClassBClassA,它们都符合这个协议,所以协议头被导入它们的头文件。

现在有点复杂了。 ClassC在第三个ProtocolB中使用(并因此导入)。该类符合第二个协议ClassB。该协议也有自己的头文件,使用和导入ClassC。因此,我的ClassA导入(直接或间接)ClassBProtocolA(导入ProtocolA)。这给了我关于warning: duplicate protocol definition of '…' is ignored

的以下警告
#import

为什么会这样?据我所知,#include宏的发明正是为了避免我们在ProtocolA.h时遇到的这类问题。如何在不使用包含警卫的情况下解决问题?我无法真正删除任何导入。

编辑:以下是说明情况的代码:

@protocol ProtocolA <NSObject> - (void)someMethod; @end

ClassA.h

#import "ProtocolA.h" @interface ClassA : NSObject <ProtocolA> ... @end

ClassB.h

#import "ProtocolA.h" @interface ClassB : NSObject <ProtocolA> typedef enum Type { TypeB1, TypeB2 } TypeB; ... @end

ProtocolB.h

#import "ClassB.h" @protocol ProtocolB <NSObject> - (TypeB)someMethod; @end

ClassC.h

#import "ProtocolB.h" @interface ClassC : NSObject <ProtocolB> ... @end

ClassC.m

#import "ClassC.h" #import "ClassA.h" // the warning appears here @implementation ClassC ... @end

#include <iostream>
using namespace std;

void Print_numm(int numm){
    cout<<numm;
    if (numm<=4) {
        Print_numm(numm+1);
    }
    cout<<numm;
}


int main() {
    Print_numm(1);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

不要在ClassB标题中导入ProtocolB,只需在其中使用@class ClassB;并移除#import "ClassB"