这个泛型函数有什么作用? [英] What does this generic function do?
本文介绍了这个泛型函数有什么作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
static inline __printf(2, 3)
int dev_err(const struct device *dev, const char *fmt, ...)
{ return 0; }
__printf()
正在做什么,第三个参数(...)开发错误意味着什么?
我可以想象这个函数是某种泛型函数。它能做什么?
推荐答案
除__printf(2,3)
外,几乎所有内容都是标准的(变量参数处理)。
函数的此修饰符(类似于static
或inline
修饰符)告诉编译器,它应该使用printf
样式格式说明符,对照从参数3开始的实际参数检查参数2(fmt
)的格式字符串。
换句话说,用:
调用它dev_err (pDev, "%d", 1.0);
将标记警告,因为格式字符串和实际参数不匹配。
...
只是表示在格式字符串之后有数量可变的参数,类似于printf
本身的实现方式。C语言长期以来一直具有处理变量参数列表的能力,__printf()
修饰符只是给编译器一些额外的信息,以便它可以验证您对函数的使用。
Linux将__printf(a, b)
定义为<[2-10],GCC允许第二种格式按照here指定变量检查属性:
格式(原型、字符串索引、首检):
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()
函数,它几乎肯定是一个占位符。
这篇关于这个泛型函数有什么作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文