我有一个只有类方法(实用程序)的类,所以我的界面就像:
@interface MyUtils : NSObject {
}
Xcode不喜欢它并说:
警告:struct没有命名成员
所以我必须创建一个无意义的实例变量?我的代码工作得很好,但是......我只是为编译器激活了各种警告。
答案 0 :(得分:5)
警告本身不是任何方式的错误,误导或错误。你有一个结构,它是空的,而在C中,有一个没有成员的结构是不常见的。您看到警告的事实是,这取决于您与谁交谈。
这是你的问题:Objective-C是使用GCC编译的,GCC是一个带有Objective-C扩展的C编译器。
Objective-C是C的子集。类似地,Objective-C类是C结构的子集。
在Objective C中,在类中没有属性是完全正常的。在C中,在结构中没有成员是很不寻常的。
GCC是一个C编译器。
这是您的警告源自的地方。海湾合作委员会的Objective-C支持不够聪明,无法摆脱这种警告,或者你认为不应该这样做。
在类中没有属性的情况下,通常会删除花括号。但是,这不会消除警告。
如果您不小心创建了一个标准结构(即使在Objective-C代码中),那么您会欣赏这个警告,因为通常意外创建的结构没有成员,并且它会导致许多奇怪的问题。
如果您启用-pedantic进行编译,那么会有一些像这样的警告,并且它们都有扎实的根源。有些像这样,是由于Objective-C和C约定之间的细微差别。其他人是GCC警告您,您的代码可能无法在其他操作系统上编译。有些人认为你永远不应该看到它们,有些人认为这些信息是完全正常的。
如果您使用的是Xcode,我建议您在项目中使用两个目标。一个正常的警告,一个与你的疯狂警告。使用第一个目标进行正常编码。如果您无法在5分钟内识别出错误,请使用第二个目标。有许多教程在Xcode中处理目标。
答案 1 :(得分:2)
不,您不必创建无意义的实例变量,因为它不是错误而是警告。编译器只是发现了一个奇怪的情况并决定警告你(并且只是因为你的自定义警告设置)。
在这种情况下,我会说忽略它(和/或将产生的警告数量降低到更合理的程度)。
答案 2 :(得分:1)
您已选中“迂腐警告”,为编译器设置-pedantic
。 GCC docs仅指发出严格的ISO C和ISO C ++对此标志所要求的警告,因此我假设Objective-C正在幕后做一些绊倒警告的事情。取消选中该设置。
答案 3 :(得分:0)
假设你没有做任何奇怪的事情,这听起来像编译器错误。一个类不应该给出结构警告。
答案 4 :(得分:0)
如果缺少实例变量确实是这个警告背后的原因,你是否意识到你可以删除花括号? e.g。
@interface Foo : NSObject
+ (void)fooBar;
@end
看看Cocoa标题,很多类都是这样的。
答案 5 :(得分:0)
如果缺少实例变量确实是此警告背后的原因,您是否意识到>你可以删除花括号吗? e.g。
@interface Foo : NSObject
+ (void)fooBar;
@end
看看Cocoa标题,很多类都是这样的。
但是你在你的fooBar方法中得到了相同的警告1行。