На верхнем уровне static
означает «недоступный напрямую (без указателя) вне этого файла» (область действия файла). extern
означает «определенный в другом объектном файле». static extern
не имеет никакого смысла. Это как запросить доступ к приватному члену из другого класса. Вы не хотите использовать static
здесь.
Просто сделайте нормальное определение в вашем .m
:
void *MyErrorDomain = @"MyErrorDomain";
И сделайте внешнее объявление в вашем .h
:
extern void *MyErrorDomain;
Обязательно связывайте в .o
из .m
всякий раз, когда вы связываете что-то, что использует переменную (после включения файла .h
). В Xcode, на вкладке Targets окна Get Info для файла .m
, обязательно проверьте каждую цель, которая использует переменную (возможно, немного отличающаяся в более новых версиях, моя старая!).
Вероятно, вы можете добавить const
(const …
и extern const …
), но экземпляры NSString являются неизменяемыми, поэтому это не является абсолютно необходимым. Вы можете превратить его в указатель const
, поэтому указатель не может быть изменен напрямую во время выполнения (без исключения const
ness). Вместе у вас есть const void * const MyErrorDomain
в определении. Просто добавьте в декларацию extern
.
Также, в зависимости от ваших целей, вы можете рассмотреть возможность использования NSString *
вместо void *
.