static inline __printf(2, 3)
int dev_err(const struct device *dev, const char *fmt, ...)
{ return 0; }
什么是__printf()
做什么以及dev_err的第三个arg(...)是什么意思?
我能够想象这个函数是某种通用函数。它做了什么?
答案 0 :(得分:13)
除了__printf(2,3)
之外,其他所有内容都是标准的(可变参数处理)。
函数的这个修饰符(类似于static
或inline
修饰符)告诉编译器应该在参数2(fmt
)处检查格式字符串对从参数3开始的实际参数,使用printf
样式格式说明符。
换句话说,用:
调用它dev_err (pDev, "%d", 1.0);
会标记警告,因为格式字符串和实际参数不匹配。
...
只表示格式字符串后面有可变数量的参数,类似于printf
本身的实现方式。 C长期以来有能力处理变量参数列表,__printf()
修饰符只是给编译器一些额外的信息,以便它可以验证你对函数的使用。
Linux将__printf(a, b)
定义为__attribute__((format(printf, a, b)))
,gcc允许第二种格式根据here指定varargs-checking属性(在下面叙述):
格式(原型,字符串索引,首先检查):
format属性指定函数采用printf,scanf,strftime或strfmon样式参数,这些参数应根据格式字符串进行类型检查。例如,声明:
extern int my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 2, 3)));
使编译器检查对my_printf的调用中的参数,以便与printf样式格式字符串参数my_format保持一致。
在上面的示例中,格式字符串(my_format)是函数my_print的第二个参数,而要检查的参数以第三个参数开头,因此format属性的正确参数是2和3。
format属性允许您标识自己的函数,这些函数将格式字符串作为参数,以便GCC可以检查对这些函数的调用是否有错误。
关于函数本身的作用,除了返回零之外没有太多: - )
如果您希望实际实现真正的dev_err()
功能,那几乎可以肯定是占位符。
答案 1 :(得分:0)
__printf
是您在库中使用编译器定义的函数,而...
中的dev_err
表示它需要可变数量的参数va_args
;