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]));
}