这个泛型函数有什么作用? [英] What does this generic function do?

查看:21
本文介绍了这个泛型函数有什么作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

static inline __printf(2, 3)
int dev_err(const struct device *dev, const char *fmt, ...)
{ return 0; }
__printf()正在做什么,第三个参数(...)开发错误意味着什么? 我可以想象这个函数是某种泛型函数。它能做什么?

推荐答案

__printf(2,3)外,几乎所有内容都是标准的(变量参数处理)。

函数的此修饰符(类似于staticinline修饰符)告诉编译器,它应该使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆