Использование константы для объявления массива элемента
Можно ли использовать что-то подобное в Objective-C:
#define number_of_items 10
а затем использовать его как:
int arr[number_of_items];
1 ответ
Да, предполагая, что вы имеете в виду Objective C. Это в значительной степени надмножество "правильного" C, так что это совершенно нормально. Это также хорошо в C и C++.
Вы можете видеть, что это работает в следующей транскрипции:
pax> cat qq.m
#import <objc/Object.h>
// First method.
#define number_of_items 10
int arr[number_of_items];
// Second method.
#define NUMBER_OF_ROWS 10
@interface test : Object{ int xyzzy[NUMBER_OF_ROWS]; }
@end;
pax> vi qq.m ; gcc -o qq.o -c qq.m -lobjc
pax> # no errors occurred
И теперь, когда мы наконец увидели, что вы на самом деле используете:
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define NUMBER_OF_ROWS_ (IS_IPAD? 18: 18)
NUMBER_OF_ROWS_
не является константой, так как зависит от возвращаемого значения функции UI_USER_INTERFACE_IDIOM()
,
Другими словами, он не может быть рассчитан во время компиляции. Вот почему вы получаете ошибку. Вы можете увидеть это, скомпилировав следующий код:
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define NUMBER_OF_ROWS_ (IS_IPAD ? 18: 20)
int UI_USER_INTERFACE_IDIOM(void) {return 20;}
int UIUserInterfaceIdiomPad;
int main (void) {
int arr[NUMBER_OF_ROWS_];
return 0;
}
Под gcc --pedantic
, ты получаешь:
qq.m: In function ‘main’:
qq.m:8: warning: ISO C90 forbids variable length array ‘arr’
Вам либо нужно использовать динамически настраиваемую коллекцию, такую как NSMutableArray
или используйте массив максимального желаемого размера и используйте только то, что вам нужно.