这个通用功能有什么作用?

时间:2013-07-24 05:04:06

标签: c linux-kernel linux-device-driver

static inline __printf(2, 3)
int dev_err(const struct device *dev, const char *fmt, ...)
{ return 0; }

什么是__printf()做什么以及dev_err的第三个arg(...)是什么意思? 我能够想象这个函数是某种通用函数。它做了什么?

2 个答案:

答案 0 :(得分:13)

除了__printf(2,3)之外,其他所有内容都是标准的(可变参数处理)。

函数的这个修饰符(类似于staticinline修饰符)告诉编译器应该在参数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;