Aji*_*ith 8 c linux-device-driver linux-kernel
static inline __printf(2, 3)
int dev_err(const struct device *dev, const char *fmt, ...)
{ return 0; }
Run Code Online (Sandbox Code Playgroud)
什么在__printf()做什么以及dev_err的第三个arg(...)是什么意思?我能够想象这个函数是某种通用函数.它有什么作用?
pax*_*blo 14
那里的一切都非常标准(变量参数处理)除了__printf(2,3).
函数的这个修饰符(类似于static或inline修饰符)告诉编译器它应该使用样式格式说明符检查参数2(fmt)处的格式字符串与参数3开始的实际参数printf.
换句话说,用以下方法调用它:
dev_err (pDev, "%d", 1.0);
Run Code Online (Sandbox Code Playgroud)
会标记警告,因为格式字符串和实际参数不匹配.
在...简单地表示有格式字符串,类似的方式来后一参数可变数目printf本身实现.C长期以来有能力处理变量参数列表,__printf()修饰符只是给编译器一些额外的信息,以便它可以验证你对函数的使用.
Linux的定义__printf(a, b)如__attribute__((format(printf, a, b)))和gcc允许第二格式指定可变参数检查属性按照这里(下面转述):
format(archetype,string-index,first-to-check):
format属性指定函数采用printf,scanf,strftime或strfmon样式参数,这些参数应根据格式字符串进行类型检查.例如,声明:
extern int my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 2, 3)));
Run Code Online (Sandbox Code Playgroud)
导致编译器检查对my_printf的调用中的参数,以便与printf样式格式字符串参数my_format保持一致.
在上面的示例中,格式字符串(my_format)是函数my_print的第二个参数,而要检查的参数以第三个参数开头,因此format属性的正确参数是2和3.
format属性允许您标识自己的函数,这些函数将格式字符串作为参数,以便GCC可以检查对这些函数的调用是否存在错误.
至于函数本身的作用,除了返回零之外没有太多:-)
如果您希望实际实现真正的dev_err()功能,那几乎可以肯定是一个占位符.