2009-02-16 2 views
17

я использую этот код, чтобы установить мои постоянныецелая константа означает «не сводится к целому»

// Constants.h 
extern NSInteger const KNameIndex; 

// Constants.m 
NSInteger const KNameIndex = 0; 

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

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

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

Любые идеи, что может быть перепутались?

ответ

-1

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

Взгляните на связанный с этим вопрос: Objective-C switch using objects?

+1

Обратите внимание, что NSInteger определяется как int [typedef int NSInteger;], может быть, вы думаете о NSNumber? – epatel

+0

Ах, вы правы. Я еще долго не умею свободно говорить в Objective-C. – crashmstr

0

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

22

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

Ваших постоянные не является реальным «постоянная», потому что является переменной, и я предполагаю, что это может быть изменен через указатель - т.е. &KNameIndex

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

enum { 
    KNameIndex = 0, 
    kAnotherConstant = 42 
}; 

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

const int KNameIndex = 0; 
+0

Заявление const совершенно легально в Objective-C и отлично работает с NSInteger. – mouviciel

+0

Я тестировал здесь с минимальным файлом .m и gcc, и я получаю тот же самый ярлык case, который не сводится к целочисленной константе, для «const int kAA = 0;» константа (даже с g ++) – epatel

+0

const int kTest = 0; int main() { int a = 1; switch (a) { case kTest: break; } } компиляция как.m дает >> test1.m: В функции 'main': test1.m: 8: метка ошибки: case не сводится к целочисленной константе – epatel

1

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

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

11

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

#define KNameIndex 0 

... 

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

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

У меня была такая же проблема, и я решил пойти с #define, а не enum. Работает для меня ™ ;-)

Смежные вопросы