整数常量'不会减少为整数'

时间:2009-02-16 20:18:30

标签: objective-c

我使用此代码设置常量

// 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标签不会减少为整数常量”

任何可能搞砸的想法?

5 个答案:

答案 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。)

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