Глобальный массив объектов Objective-C не работает должным образом - PullRequest
2 голосов
/ 12 мая 2010

В моем файле MyConstants.h ... У меня есть:

int abc[3];

В моем подходящем файле MyConstants.m ... У меня есть:

extern int abc[3] = {11, 22, 33};

В каждом из моих других файлов * .m ... У меня есть

#import "MyConstants.h"

Внутри 1 моего метода viewDidLoad {} у меня есть:

extern int abc[];
NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));  

Почему отображается «abc = (0) (3)» вместо «abc = (22) (3)»?

Как мне заставить эту работу работать как положено?

1 Ответ

5 голосов
/ 12 мая 2010

extern должен быть в объявлении в заголовке, а не в определении в исходном файле. extern сообщает компилятору, что символ существует где-то еще, он может или не может быть в той же единице перевода. Работа компоновщика заключается в том, чтобы убедиться, что все объявленные символы действительно определены.

Заголовок констант (MyConstants.h):

extern int abc[3];

Константы Источник (MyConstants.m):

int abc[3] = {11, 22, 33};

Другой источник (SomeFile.m):

#include "MyConstants.h"
...
- (void) someMethod
{
    NSLog (@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));
}

Также обратите внимание, что при измерении размера массива деление ошибок на размер первого элемента менее подвержено ошибкам, поэтому при изменении типа abc (т.е. с int до double), результаты все еще действительны.

- (void) someMethod
{
    NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(abc[0]));
}
...