【问题标题】:Does it matter to have an class without members?有没有成员的班级有关系吗?
【发布时间】:2011-02-27 02:46:37
【问题描述】:

我有一个只有类方法(实用程序)的类,所以我的界面是这样的:

@interface MyUtils : NSObject {
}

Xcode 不喜欢,说:

警告:结构没有命名成员

所以我必须创建一个无意义的实例变量?不过,我的代码工作正常……我刚刚为编译器激活了各种警告。

【问题讨论】:

标签: iphone cocoa-touch uikit


【解决方案1】:

警告本身不是错误、误导或不正确。你确实有一个结构,它是空的,在 C 中,有一个没有成员的结构是不寻常的。您看到警告的事实是,嗯...这取决于您与谁交谈。

这是你的问题:Objective-C 是使用 GCC 编译的,GCC 是一个带有 Objective-C 扩展的 C 编译器。

Objective-C 是 C 的子集。类似地,Objective-C 类是 C 结构的子集。

在 Objective C 中,类中没有属性是完全正常的。在 C 中,结构中没有成员是很不寻常的。

GCC 是一个 C 编译器。

这是您的警告的来源。 GCC 中的 Objective-C 支持还不够聪明,无法消除该警告,或者您属于不应该这样做的学派。

在类中没有属性的情况下,习惯上去掉花括号。不过,这并不能消除警告。

如果你不小心创建了一个标准结构体(即使是在 Objective-C 代码中),那么你会喜欢这个警告,因为通常情况下,一个意外创建的结构体没有成员,并且会导致很多奇怪的问题。

如果您启用 -pedantic 进行编译,则会出现一些这样的警告,并且它们都有坚实的根源。一些,像这样,是由于 Objective-C 和 C 约定之间的细微差别。其他人是 GCC 警告您您的代码可能无法在其他操作系统上编译。有些人认为您永远不应该看到它们,而另一些人则认为这些消息是完全正常的。

如果您使用的是 Xcode,我建议您在项目中使用两个目标。一个打开正常警告,一个打开你的疯狂警告。使用第一个目标进行正常编码。如果您无法在 5 分钟内识别错误,请使用第二个目标。在 Xcode 中处理目标有很多教程。

【讨论】:

    【解决方案2】:

    不,您不必创建无意义的实例变量,因为它不是错误而是警告。编译器只是发现了一种奇怪的情况,并决定警告您(仅因为您的自定义警告设置)。

    在这种情况下,我会说忽略它(和/或将生成的警告数量减少到更理智的东西)。

    【讨论】:

      【解决方案3】:

      您已选中“Pedantic Warnings”,它为编译器设置了-pedanticGCC docs 仅指针对此标志发出严格的 ISO C 和 ISO C++ 要求的警告,因此我认为 Objective-C 正在幕后做一些事情来触发该警告。取消选中设置。

      【讨论】:

        【解决方案4】:

        假设您没有做任何奇怪的事情,这听起来像是一个编译器错误。一个类不应该给出结构警告。

        【讨论】:

          【解决方案5】:

          如果缺少实例变量确实是此警告背后的原因,您是否意识到您可以删除花括号?例如

          @interface Foo : NSObject
          + (void)fooBar;
          @end
          

          看看Cocoa的头文件,很多类都是这样的。

          【讨论】:

            【解决方案6】:

            如果缺少实例变量确实是此警告背后的原因,您是否意识到 > 您可以删除花括号?例如

            @interface Foo : NSObject
            + (void)fooBar;
            @end
            

            看看Cocoa的头文件,很多类都是这样的。

            但是你会在你的 fooBar 方法的第 1 行得到同样的警告。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-12-26
              • 2020-01-06
              • 1970-01-01
              • 2020-12-29
              • 1970-01-01
              • 2012-10-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多