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
целое.
И есть синтаксис для внешнего? В этом конкретном случае, каков смысл заявления? – pinker
Ах, еще один C++ дерьмо. – Tricertops
@pinker: 'extern' необходимо объявить (грубо говоря)« глобальные переменные ». См. Http://stackoverflow.com/a/1433387/1187415 для полного и полного объяснения. Возможно, древние компиляторы требовали ключевое слово extern также для прототипов функций. –