2013-12-23 3 views
4

Привет просматривал некоторые Objective-C код и выяснил следующее заявление:OBJC_EXTERN: Какова цель?

OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

Что это значит? Кроме того, что должно быть синтаксисом этого утверждения?

Заранее спасибо

ответ

5

OBJC_EXTERN определяется в <objc/objc-api.h>, как

#if !defined(OBJC_EXTERN) 
# if defined(__cplusplus) 
#  define OBJC_EXTERN extern "C" 
# else 
#  define OBJC_EXTERN extern 
# endif 
#endif 

и, следовательно, предотвращает «имя C++ коверкая», даже если выше декларация включена из C++ исходного файла, как, например, объяснил здесь:

Для чистого кода на C вы можете просто удалить OBJC_EXTERN, потому что ключевое слово не требуется в объявлении функции.


NS_FORMAT_FUNCTION определяется как

#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A))) 

и __attribute__((format(...))) является специфическим расширением GCC, также понимать по Clang:

Это позволяет компилятору проверять количество и типы списка аргументов переменной на строку формата. Например

CLSLog(@"%s", 123); 

вызовет предупреждение компилятора, поскольку %s является заполнителем для строки, но 123 целое.

+0

И есть синтаксис для внешнего? В этом конкретном случае, каков смысл заявления? – pinker

+0

Ах, еще один C++ дерьмо. – Tricertops

+0

@pinker: 'extern' необходимо объявить (грубо говоря)« глобальные переменные ». См. Http://stackoverflow.com/a/1433387/1187415 для полного и полного объяснения. Возможно, древние компиляторы требовали ключевое слово extern также для прототипов функций. –

 Смежные вопросы

  • Нет связанных вопросов^_^