【问题标题】:integer constant does 'not reduce to an integer'整数常量“不会减少为整数”
【发布时间】:2009-02-16 20:18:30
【问题描述】:

我使用这段代码来设置我的常量

// 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;
    ...

我在编译时收到错误消息:“error:case label does not reduce to an integer constant”

有什么想法可能会搞砸吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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

    通常将常量定义为enum

    enum {
        KNameIndex = 0,
        kAnotherConstant = 42
    };
    

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

    const int KNameIndex = 0;
    

    【讨论】:

    • const 语句在 Objective-C 中是完全合法的,并且在 NSInteger 中完全可以操作。
    • 我在这里使用最小的 .m 文件和 gcc 进行了测试,对于“const int kAA=0;”,我得到了相同的“案例标签不会减少为整数常量”。常量(即使使用 g++)
    • const int kTest = 0; int main() { int a = 1; switch (a) { case kTest: break; } } 编译为 .m 给出 >> test1.m: In function ‘main’: test1.m:8: error: case label does not reduce to an integer constant
    【解决方案2】:

    你可以使用

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

    它应该可以工作。

    刚遇到同样的问题,我决定使用#define 而不是枚举。为我工作™ ;-)

    【讨论】:

      【解决方案3】:

      这是因为我很久没有使用 Cocoa / ObjC 了,但是成员变量 sectionFromParentTable 不是 int 类型的吗?

      【讨论】:

        【解决方案4】:

        我没有使用过 Objective C,但我会尝试使用“extern”。至少如果这是 C++,Constants.m 文件不会是Other.m 的编译单元的一部分,因此编译器将不知道KNameIndex 的值。这可以解释错误;不可知的值不能是常数。

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

        【讨论】:

          【解决方案5】:

          我认为您坚持使用const int 而不是const NSInteger,因为开关仅适用于内置整数类型。 (不确定你的语法在类型之后翻转了 const)。

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

          【讨论】:

          • 注意 NSInteger 被定义为一个 int [typedef int NSInteger;] 也许你在想 NSNumber?
          • 啊,你是对的。我离精通 Objective-C 还有很长的路要走。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多