繁体   English   中英

NS_ENUM提供有关前向引用的编译器警告

[英]NS_ENUM gives compiler warning about forward references

我使用spiffy new NS_ENUM尝试在我的objective-c iOS项目中定义一个枚举。

我在类的标题中声明了NS_ENUM,如下所示:

NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

@interface Issue : NSObject
....

我得到编译器警告:

ISO C禁止前向引用“枚举”类型

现在,如果我定义enum(稍微)旧的传统方式,如下所示:

typedef enum{
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
}SomeEnumType;

@interface Issue : NSObject
....

在代码中完全相同的位置,问题就消失了。 我对NS_ENUM做错了什么?

编辑:

我通过添加typedef来纠正它,但它仍然发出警告。

我打开了迂腐的编译器警告。 这只是一个过于迂腐的情况,还是有一种错误的正确方法?

尝试:

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

NS_ENUM不会为你声明SomeEnumType类型做typedef,你必须自己做。

更新:出现警告的原因是由于NS_ENUM的实现。 让我们看看它尝试做什么:

#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type

问题(我相信)是这样的:

enum _name : _type _name;

这是在宏本身内执行前向声明。 因此,随着迂腐的警告,它正在标志着这种使用。

迂腐警告只是说明你是否想要将其转换为纯C,它不会是可移植的,因为它不遵循枚举的前向声明的标准化。 在Xcode,Clang和LLVM(以及由Apple提供的NS_ENUM这一事实)的范围内,你应该非常安全。

你错过了typedef

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

你提到你正在使用迂腐警告。 编译器是正确的:固定类型的枚举是C ++标准的一部分 ,而不是ISO C.

正如其他人所指出的那样,迂腐警告是正确的。 但是,您不必使用NS_ENUM宏来利用严格类型的枚举。 只需声明这样的枚举,当您保留严格的输入时警告就会消失:

typedef enum : int {
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
} SomeEnumType;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM