static inline __printf(2,3) int dev_err(const struct device *dev,const char *fmt,...) { return 0; }
什么是__printf()正在做什么以及dev_err的第三个arg(…)是什么意思?
我能够想象这个函数是某种通用函数.它有什么作用?
解决方法
函数的这个修饰符(类似于静态或内联修饰符)告诉编译器它应该使用printf样式格式说明符检查参数2(fmt)处的格式字符串与从参数3开始的实际参数.
dev_err (pDev,"%d",1.0);
会标记警告,因为格式字符串和实际参数不匹配.
…只是表示格式字符串后面有可变数量的参数,类似于printf本身的实现方式. C长期以来有能力处理变量参数列表,__ printf()修饰符只是给编译器一些额外的信息,以便它可以验证你对函数的使用.
Linux将__printf(a,b)定义为__attribute __((format(printf,a,b)))并且gcc允许第二种格式根据here指定varargs-checking属性(下面将解释):
format (archetype,string-index,first-to-check):
The format attribute specifies that a function takes printf,scanf,strftime or strfmon style arguments which should be type-checked against a format string. For example,the declaration:
extern int my_printf (void *my_object,const char *my_format,...) __attribute__ ((format (printf,2,3)));
causes the compiler to check the arguments in calls to my_printf for consistency with the printf style format string argument my_format.
In the example above,the format string (my_format) is the second argument of the function my_print,and the arguments to check start with the third argument,so the correct parameters for the format attribute are 2 and 3.
The format attribute allows you to identify your own functions which take format strings as arguments,so that GCC can check the calls to these functions for errors.
至于函数本身的作用,除了返回零之外没有太多:-)
如果您希望实际实现真正的dev_err()函数,那几乎可以肯定是一个占位符.