7

我曾经有一堂课叫Constants. 里面是这样的typedef

typedef enum visible_thing {

    BACKGROUND,
    BACKGROUND_COLOR,
    MAIN_WINDOW

} VISIBLE_THING;

而我的,生活是美好的!我在需要访问此类型的任何地方都导入了“Constants.h”,并且一切正常。

然后我决定对Constants班级进行核弹。我拿了 typedef 并将它放在另一个类中,为了清楚起见,我们称之为OtherClass. 我经历并将所有的导入更改Constants.h为导入,OtherClass.h这就是我所做的一切,我没有触及任何其他代码。现在整个事情都坏了!

完美配合的方法Constants现在给了我这个错误:Parse Issue - Expected a type. 有没有搞错?我当然希望有人对此有一些线索!

更新:令人沮丧的是,这是似乎在没有解释的情况下自行消失的问题之一。我在下面回答了我自己的问题,我发现一种解决方法需要在一个文件中多次#import-ing 相同的标头。但是今天我删除了额外的#import,一切仍然有效。精氨酸。电脑!

4

4 回答 4

8

我得到了相同的“预期类型”,事实证明它是由导入循环引起的。我用以下简单的例子复制了它:

啊:

#import "B.h"

typedef enum {
    SomeEnumA
} SomeEnum;

@interface A : NSObject

@end

乙:

#import "A.h"

@interface B : NSObject

- (void) func:(SomeEnum)arg;

@end

编译器在编译 Am(它只导入 Ah)时抱怨 SomeEnum 在 Bh 中未知。发生这种情况是因为 Ah 导入 Bh 而导入 Ah 不会发生导入循环,因此在这种情况下 Bh 不包括定义类型的 Ah 代码。

通过将枚举的定义移动到单独的 SomeEnum.h 可以轻松解决该问题。

于 2014-02-09T06:52:48.923 回答
1

我可能会尝试弄清楚发生了什么,因为导致这种情况发生的原因可能会在未来导致其他神秘的错误,到那时你可能已经忘记了这一点,这可能会使追查原因变得更加困难未来的错误。

我会尝试隔离问题。您可以尝试的几件事:

  • 逐步注释掉 InnerClass 接口中的代码,看看是否可以解决问题。
  • 在文件顶部手动添加 typedef 并使用不同的类型名称(并适当地编辑其余代码)以查看问题是否仍然存在。
  • 发布您的 .h 文件和 OtherClass.h 文件,看看是否有其他人可以发现问题
  • David H 建议创建一个演示项目,看看是否可以重现问题

我认为这取决于你的项目是什么,如果它只是你想要开始工作的小而快的东西,那可能没关系,但如果它是一个更大的项目并且你预见到你的代码库会扩展,或者如果这也是其他编码人员将要做的事情,我会尝试了解这里发生了什么。

于 2012-09-10T13:38:22.720 回答
0

产生错误的类里面有另外两个类定义,帮助类只在内部使用。显然这就是问题的根源。

我不知道的是,如果你这样做,如果一个文件中有多个类,你可能需要多次导入同一个标题。

这是我为修复它所做的。我改变了这个:

#import "OtherClass.h"

@interface InnerClass

// uses typedef from OtherClass

@end



@interface MainClass

// uses typedef from OtherClass

@end

对此:

#import "OtherClass.h"

@interface InnerClass

// uses typedef from OtherClass

@end

#import "OtherClass.h" //<--without this, MainClass won't recognize the typedef 

@interface MainClass

// uses typedef from OtherClass

@end

这看起来很笨重,就像我可能做错了什么,但至少它解决了手头的问题。任何后续评论将不胜感激。

于 2012-09-09T17:06:42.040 回答
0

我只是在尝试创建一个框架时偶然发现了这个。Xcode 不喜欢将 typedef 定义在接口之上。不知道为什么会这样,但它修复了它。

所以我改变了我的:

typedef enum {
   MyOption1,   // option 1.
   MyOption2,   // option 2.
}MyOption;

@interface MyClass : NSObject

@property (strong, nonatomic) NSString *myString;

@end

到:

@interface MyClass : NSObject

typedef enum {
   MyOption1,   // option 1.
   MyOption2,   // option 2.
}MyOption;

@property (strong, nonatomic) NSString *myString;

@end
于 2019-06-20T15:14:24.177 回答