我使用此代码设置常量
// 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;
...
我在编译时遇到错误:“错误:case标签不会减少为整数常量”
任何可能搞砸的想法?
答案 0 :(得分:22)
对于C / C ++和Objective-C,case语句必须具有固定值 - 在编译时“缩减为整数(读取值)”
你的常量不是真正的“常量”,因为它是一个变量,我想它可以通过指针改变 - 即&KNameIndex
通常将常量定义为enum
enum {
KNameIndex = 0,
kAnotherConstant = 42
};
如果您使用C ++或Objective-C ++(.mm作为文件扩展名),您可以使用const语句
const int KNameIndex = 0;
答案 1 :(得分:11)
您可以使用
#define KNameIndex 0
...
switch (self.sectionFromParentTable) {
case KNameIndex:
self.types = self.facilityTypes;
break;
...
它应该有用。
遇到了同样的问题,我决定选择#define而不是enum。为我工作™; - )
答案 2 :(得分:1)
我没有使用过Objective C,但我会尝试放弃'extern'。至少如果这是C ++,Constants.m
文件将不是Other.m
的编译单元的一部分,因此编译器将不知道KNameIndex
的值。这可以解释错误;一个不可知的值不能是常数。
在Constants.h
文件帮助中放置定义而不仅仅是声明吗?
答案 3 :(得分:0)
这是一个黑暗中的刺,因为我现在很久没有使用Cocoa / ObjC,但是成员变量sectionFromParentTable不是int类型吗?
答案 4 :(得分:-1)
我认为你很难使用const int
代替const NSInteger
,因为交换机仅适用于内置的整数类型。 (不确定你的语法是在类型后翻转const。)