【问题标题】:Enums in Objective-C VS CObjective-C VS C 中的枚举
【发布时间】:2011-08-20 14:53:22
【问题描述】:

南非, 我所知道的是,Objective-C 是 C 的严格超集。

但是当我尝试了一个我曾经在 C 中使用的非常简单的枚举示例时,它在目标 C 中不起作用,

代码如下:

#import <Foundation/Foundation.h>

int main(void)
{
    typedef enum 
    {
        SUN, MON, TUES
    }DAYS;

    DAYS d = MON;

    NSLog(@"%@", d);

    return 0;
}

#include <stdio.h>

int main(void)
{
    typedef enum 
    {
        SUN, MON, TUES
    }DAYS;

    DAYS d = MON;

    printf("%d\n", d);

    return 0;
}

在 C 中,它可以完美运行,但在 Objective-c 中(我在 WIN 上使用 GNUstep)它在执行时崩溃(没有编译时错误)

谁能告诉我为什么?

【问题讨论】:

    标签: objective-c c enums


    【解决方案1】:

    %@ 是一个对象说明符,枚举是一个 int(有符号或无符号)。要在 Objective-C 中打印枚举,您需要在 NSLog 中使用 %d

    NSLog(@"%d", d);
    

    您的原始示例崩溃了,因为它期望 d 是一个对象,因此它会尝试将 description 消息发送到位于内存地址 1 的对象(MON 的值)。

    【讨论】:

      【解决方案2】:

      试试这个

      int main(void)
      {
          typedef enum 
          {
              SUN, MON, TUES
          }DAYS;
      
          DAYS d = MON;
      
          NSLog(@"%d", d); //here is your mistake happened, because enum return values are integers.
      
          return 0;
      }
      

      希望有帮助

      【讨论】:

        【解决方案3】:

        随便用

        NSLog(@"%d", d);
        

        而不是

        NSLog(@"%@", d);
        

        请记住,在 Objective-C 中,并非所有事物都会自动成为对象。 C 中的原始类型仍然只是原始类型。因此,在NSLog 的格式化字符串中,您仍然需要使用您一直使用的相同说明符。

        【讨论】:

          【解决方案4】:

          由于NSLog(@"%@") 语句而崩溃。 %@ 格式说明符需要 NSObject* 的实例(或子类),而您传递 enum 项目 (ie. int) 。

          试试NSLog("%d\n", d);

          【讨论】:

            【解决方案5】:

            使用盒装表达式,您可以继续在格式说明符中使用 %@:

            NSLog(@"%@", @(d));
            

            这并不完全是最佳的,但在调试时确实不是问题。如果您要转储数百万的字符串格式的数字,请使用正确的数字格式。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-14
              • 1970-01-01
              • 2010-09-26
              • 1970-01-01
              • 2012-12-14
              相关资源
              最近更新 更多