【问题标题】:Using the GCC __unused attribute with Objective-C在 Objective-C 中使用 GCC __unused 属性
【发布时间】:2008-11-12 22:19:58
【问题描述】:

是否可以在 Objective-C 对象方法参数上使用 __unused 属性宏?我尝试将它放置在参数声明周围的不同位置,但它要么导致编译错误,要么似乎被忽略(即编译器在使用 -Wall -Wextra 编译时仍会生成未使用的参数警告)。

有人能用这个吗? Objective-C 不支持它吗?作为参考,我目前正在使用 Apple 构建的 GCC 4.0.1。

【问题讨论】:

    标签: objective-c gcc


    【解决方案1】:

    好的,我找到了答案……这似乎是 Apple 的 gcc 4.0 实现的一个错误。使用 gcc 4.2 它可以按预期工作,正确的位置如下:

    -(void)someMethod:(id) __unused someParam;
    

    如果有人感兴趣,它会记录在 Objective-C 发行说明中:http://developer.apple.com/releasenotes/Cocoa/RN-ObjectiveC/index.html#//apple_ref/doc/uid/TP40004309-DontLinkElementID_6

    请注意,Louis,您的答案将被编译,但正如我在问题中所说,它实际上不会做任何事情或抑制编译器发出的未使用警告。

    编辑:我为此rdar://6366051 向苹果提交了错误报告。

    【讨论】:

      【解决方案2】:

      一个常见的习惯用法是使用以下内容:

      #define UNUSED(x) (void)x
      void SomeFunction(int param1, int param2)
      {
        UNUSED(param2);
        // do stuff with param1
      }

      UNUSED(param2) 语句不生成任何目标代码,消除有关未使用变量的警告,并清楚地将代码记录为未使用变量。

      【讨论】:

      • 实际上,在这种情况下,使用 -Wall -Wextra 你最终会得到一个没有效果警告的语句:)
      • 已修复 - 强制转换为 void 会消除该警告
      • 抱歉打到了。既然未使用是一个编译器提示,这不就和 -Wno-unused 一样高效吗?
      【解决方案3】:

      我认为您可以使用#pragma used 将参数标记为未使用。未经测试,但您可以尝试类似

      - (NSString *)test:(NSString *)test {
      #pragma unused (test);
        return nil;
      }
      

      【讨论】:

      • 您需要将变量括在括号中以表示未使用的#pragma。所以:#pragma used(timer) 确实有效,但我不太喜欢它的工作方式。事实证明这是一个错误。
      【解决方案4】:

      我可以很好地编译以下内容:

      - (NSString *) test:(__unused NSString *)test {
          return nil;
      }
      

      编辑:实际上,这可能不是严格意义上的拱门:

      Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror
      Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror  -Wunused-parameter
      cc1obj: warnings being treated as errors
      Pusher.m:40: warning: unused parameter ‘test’
      Phoenix-VI:CouchPusher louis$ 
      

      所以 -Wall 不包括不包括 -Wunused-parameter....

      【讨论】:

      • 是的,我也可以编译它,但是试试 gcc -Wall -Wextra 看看会发生什么:)
      • 不,-Wall 没有,您需要为此使用 -Wextra... 但我总是在我的代码中同时使用 -Wall 和 -Wextra,而且我对未使用的警告噪音感到恼火。
      • 我使用 -Werror 和大多数警告,但我有一些特定的警告,我通常会关闭 -Wunused-parameters 是其中之一,因为代表往往有无法删除的未使用参数。
      【解决方案5】:

      在与#pragma 斗争了一段时间后,我发现它是

      + (NSString*) runQuery:(id)query name:(NSString*)name options:(NSDictionary*)options
      {
      #pragma unused(name)
       ...
      
      }
      

      【讨论】:

      • 是的,我真的很想将未使用的关键字放在方法行中。出于某种原因,我觉得它“属于”那里。无论如何,根据 Apple 的说法,4.2 版之前的 GCC 根本不支持它,就是这样。否则,如果使用 4.2 或更高版本,它会按您的预期工作:)
      猜你喜欢
      • 2011-07-07
      • 2014-12-12
      • 2011-06-10
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 2011-05-15
      相关资源
      最近更新 更多