2009-02-16 121 views
17

我用这个代码来设置我的常量整型常量是“不能减少到一个整数”

// Constants.h 
extern NSInteger const KNameIndex; 

// Constants.m 
NSInteger const KNameIndex = 0; 

而且在进口Constant.h文件,我有这样的一个文件中的switch语句:

switch (self.sectionFromParentTable) { 
    case KNameIndex: 
     self.types = self.facilityTypes; 
     break; 
    ... 

我会在编译,上面写着这个错误:“错误:案件标签不减少一个整数常量”

任何想法可能会搞砸?

回答

-1

我认为你坚持使用const int而不是const NSInteger,因为开关仅适用于内置整型。 (不知道你的语法与类型后的常量翻转)。

看看相关的问题:Objective-C switch using objects?

+1

请注意,NSInteger被定义为一个int [typedef int NSInteger;]也许你正在考虑NSNumber? – epatel 2009-02-16 20:44:42

+0

啊,你说得对。在流行Objective-C方面,我还有很长的路要走。 – crashmstr 2009-02-16 20:46:16

0

这是一个在黑暗中刺,因为我没有使用可可/ ObjC现在在很长一段时间,但成员变量sectionFromParentTable不是int类型的?

22

对于C/C++和Objective-C必须case语句具有固定值 - “减少到一个整数(读取值)”在编译时

你的常量是不是一个真正的“恒定”,因为它是一个变量,我想它可以通过指针被改变 - 即&KNameIndex

通常一个常量定义为enum

enum { 
    KNameIndex = 0, 
    kAnotherConstant = 42 
}; 

如果你想我们ËC++或Objective-C++(以.mm作为文件扩展名),你可以使用const语句作为

const int KNameIndex = 0; 
1

我还没有与目标C的工作,但我想尝试吸住“EXTERN”。至少如果这是C++,则Constants.m文件将不是Other.m的编译单元的一部分,因此编译器不知道KNameIndex的值。这将解释错误;一个不可知的值不能是一个常数。

是否将Constants.h文件中的定义,而不仅仅是声明放在帮助文件中?

11

您可以使用

#define KNameIndex 0 

... 

switch (self.sectionFromParentTable) { 
     case KNameIndex: 
       self.types = self.facilityTypes; 
       break; 
     ... 

,它应该工作。

刚刚有同样的问题,我决定去与#define而不是枚举。适用于我™ ;-)