您正在查看一些Objective-C代码,并发现以下声明:
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
这意味着什么?那么,这个陈述的语法应该是什么?
提前致谢
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++源代码中,extern"C"的作用是什么?
对于纯C代码,您可以删除OBJC_EXTERN
,因为extern
函数声明中不需要关键字.
NS_FORMAT_FUNCTION
被定义为
#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
并且__attribute__((format(...)))
是一个GCC特定的扩展,Clang也理解:
http://clang.llvm.org/docs/LanguageExtensions.html#format-string-checking
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
它允许编译器根据格式字符串检查变量参数列表的数量和类型.例如
CLSLog(@"%s", 123);
会导致编译器警告,因为它%s
是字符串的占位符,但是123
是整数.