целочисленная константа не сводится к целому числу - PullRequest
17 голосов
/ 16 февраля 2009

Я использую этот код для установки моих констант

// Constants.h
extern NSInteger const KNameIndex;

// Constants.m
NSInteger const KNameIndex = 0;

И в инструкции switch в файле, который импортирует файл Constant.h, у меня есть это:

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

При компиляции я получаю сообщение об ошибке: «ошибка: метка регистра не сводится к целочисленной константе»

Есть идеи, что может быть испорчено?

Ответы [ 5 ]

22 голосов
/ 16 февраля 2009

Для C / C ++ и Objective-C оператор case должен иметь фиксированные значения - «сводится к целому числу (чтение значения) » во время компиляции

Ваши константы не являются настоящей "константой", потому что это переменная, и я думаю, что ее можно изменить с помощью указателя - то есть &KNameIndex

Обычно константы определяются как enum

enum {
    KNameIndex = 0,
    kAnotherConstant = 42
};

Если вы используете C ++ или Objective-C ++ (с расширением .mm в качестве расширения файла), вы можете использовать оператор const как

const int KNameIndex = 0;
11 голосов
/ 04 августа 2010

Вы можете использовать

#define KNameIndex 0

...

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

и должно работать.

Просто была такая же проблема, и я решил использовать #define, а не enum. Работает для меня и торговли; ; -)

1 голос
/ 17 февраля 2009

Я не работал с Objective C, но я бы попробовал бросить 'extern'. По крайней мере, если бы это был C ++, файл Constants.m не был бы частью единицы компиляции Other.m, поэтому значение KNameIndex было бы неизвестно компилятору. Который объяснил бы ошибку; непознаваемое значение не может быть константой.

Помогает ли поместить определение, а не только объявление, в файл Constants.h?

0 голосов
/ 16 февраля 2009

Это удар в темноте, потому что я давно не использовал Cocoa / ObjC, но является ли переменная-член sectionFromParentTable не типом int?

0 голосов
/ 16 февраля 2009

Я думаю, что вы застряли с использованием const int вместо const NSInteger, поскольку коммутатор работает только со встроенными целочисленными типами. (не уверен насчет вашего синтаксиса, когда const переключается после типа).

Взгляните на связанный вопрос: Переключатель Objective-C с использованием объектов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...