使用常量声明一个项数组

时间:2012-04-05 08:20:30

标签: objective-c arrays constants c-preprocessor

是否可以在Objective-C中使用这样的东西:

#define number_of_items 10

然后将其用作:

int arr[number_of_items];

1 个答案:

答案 0 :(得分:1)

是的,假设你的意思是目标 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或使用所需的最大大小的数组,并且只使用您需要的数据。