C/C++编程:__attribute__((format(printf, a, b)))

1060 篇文章 297 订阅
本文介绍了C语言中使用_attribute_((format(printf,a,b)))来解决可变参数函数类型和数量检查的问题。该属性用于函数声明,通过指定format参数,编译器将在编译时检查函数调用的参数是否符合printf格式,从而在编译阶段发现潜在错误。示例展示了如何在普通函数中应用此特性,并提醒在类成员函数中需要注意this指针的位置。
摘要由CSDN通过智能技术生成

理论

  • ​ 在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指针,这个也要考虑到位置中。

实例

普通函数

在普通函数中,string-index和first-to-check参数值即为实际的位置,如下面的测试样例string-index=1,first-to-check=2

#include <stdio.h>
#include <stdarg.h>

#if 1
#define CHECK_FMT(a, b)	__attribute__((format(printf, a, b)))
#else
#define CHECK_FMT(a, b)
#endif

void TRACE(const char *fmt, ...) CHECK_FMT(1, 2);

void TRACE(const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);

    (void)printf(fmt, ap);

    va_end(ap);
}

int main(void)
{
    TRACE("iValue = %d\n", 6);
    TRACE("iValue = %d\n", "test");

    return 0;
}

attribute((format(printf, a, b)))

类成员函数暂时没有用到,不研究了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值