OBJC_EXTERN:目的是什么?

pin*_*ker 5 objective-c extern

您正在查看一些Objective-C代码,并发现以下声明:

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

这意味着什么?那么,这个陈述的语法应该是什么?

提前致谢

Mar*_*n R 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
Run Code Online (Sandbox Code Playgroud)

因此,即使上述声明包含在C++源文件中,也会阻止"C++名称重整",例如:

对于纯C代码,您可以删除OBJC_EXTERN,因为extern 函数声明中不需要关键字.


NS_FORMAT_FUNCTION 被定义为

#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
Run Code Online (Sandbox Code Playgroud)

并且__attribute__((format(...)))是一个GCC特定的扩展,Clang也理解:

它允许编译器根据格式字符串检查变量参数列表的数量和类型.例如

CLSLog(@"%s", 123);
Run Code Online (Sandbox Code Playgroud)

会导致编译器警告,因为它%s是字符串的占位符,但是123是整数.