2011-08-20 145 views
4

SA, 我所知道的是,Objective-C的是C的限制超..枚举在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)执行时崩溃(没有编译时错误)

有谁能告诉我为什么?

回答

17

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

NSLog(@"%d", d); 

你原来的例子是崩溃,因为它预期d是一个对象,因此它会试图发送description消息驻留在内存地址1(的MON值)的对象。

2

由于NSLog(@"%@")声明而崩溃。 %@格式说明符需要NSObject*(或其子类)的实例,而您通过enum项(int)。

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

2

只需使用的

NSLog(@"%d", d); 

代替

NSLog(@"%@", d); 

记住,在Objective-C,不是一切自动成为对象。 C中的基元类型仍然是原始类型。因此,在NSLog的格式化字符串中,仍然需要使用您始终使用的相同说明符。

3

试试这个

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; 
} 

希望这有助于

0

并与盒装表情,你可以保持在您的格式说明符使用%@:

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

这不正是最佳,但在调试时它确实不成问题。如果您以数百万的价格倾销字符串格式的数字,请使用适当的数字格式。