Использование константы для объявления массива элемента

Можно ли использовать что-то подобное в 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 или используйте массив максимального желаемого размера и используйте только то, что вам нужно.

Другие вопросы по тегам