_attribute_((format(printf, 2, 3)))用法详解
在阅读redis源码的时候,遇到_attribute_((format(printf, 2, 3)))用法,在此记录下该用法的作用以及需要注意的点。
1. 用法及作用
在C语言编程过程中,我们常常会实现一些可变参数的函数调用(类scanf、printf函数),变参函数在我们编程过程中带来了很大的方便,但是也有一些问题,即我们在调用可变参数的函数的时候,默认情况下编译器检查不出可变参数的类型或者个数是否正确,这就导致使用变参函数的时候,若稍不注意写错了参数,很难被发现和定位。
_attribute_((format(printf, 2, 3)))的作用就是用来解决这个问题,它用于函数声明,作用是提示编译器检查函数调用的过程中,可变参数部分按照printf的规则进行检查,若参数的个数或者类型不匹配,编译过程中将会发出警告,这就使得上面提到的问题在编译期间就能发现。注意编译时要加上 –Wall才可以。
// 用法原型
// archetype:为按照那种风格进行校验,如printf/scanf等
// string-index:格式化format字符串所在的位置,如void test(testA, format,...),此时为2
// first-to-check:第一个可变参数的位置,如void test(testA, format,...),此时为3
__attribute__((format(archetype, string-index, first-to-check)))
注意:string-index和first-to-check值选取的时候,若变参函数是类成员函数,这时函数展开后第一个参数为this指针,这个也要考虑到位置中。
2.使用示例
2.1 普通函数使用示例
在普通函数中,string-index和first-to-check参数值即为实际的位