博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配
阅读量:7225 次
发布时间:2019-06-29

本文共 1450 字,大约阅读时间需要 4 分钟。

背景

在输出日志时 被 RUNLOG_DEBUG("%s,%d", para_int, para_str.c_str()) 坑过, 才知道 能校验 格式化字符串和 字段本身是否匹配 的重要性;

参考文献: 感谢原作者

方法

attribute format 该属性 可以给被声明的 函数 加上 类似 printf /scanf 的特征, 能用于 编译器检查 函数声明和时间调用参数直接的 格式化字符串是否 匹配; GNU CC需要使用 –Wall 才能使用

语法: format (archetype, string-index, first-to-check)

archetype :  printf, scanf, strftime或strfmon,  表示按照那种风格进行检查string-index: 传入参数的第几个参数是格式化字符串, 就是 "%s,%d" 的下标(从1 开始)first-to-check: 指定从 函数的 第几个参数开始 校验

实例:

__attribute__((format(printf,m,n)))

m:第几个参数为格式化字符串(format string)

n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几.这里需要注意,有时函数参数里还有“隐身”的,如C++的类成员函数的第一个参数实际上是"隐身"的"this"指针;

代码实例

#include 
#include
#include
using namespace std;#define mm_p(fmt, args...) myprint(fmt, args)void myprint(const char *fmt,...) __attribute__((format(printf,1,2)));void myprint(const char *fmt,...){ va_list ap; va_start(ap, fmt); vprintf(fmt,ap); va_end(ap);}struct ss{public: void pri(const char* fmt, ...) __attribute__((format(printf,2,3))) { } };int main(){ mm_p("dfjkaj[%d][%s]\n",123,456); myprint("dfjkaj[%d][%d]\n",123,456); ss s; s.pri("%s[%s", "dd",456);}
g++ -Wall test_var.cpp -o test_vartest_var.cpp: In function 'int main()':test_var.cpp:27: warning: format '%s' expects type 'char*', but argument 3 has type 'int'test_var.cpp:31: warning: format '%s' expects type 'char*', but argument 4 has type 'int'

转载于:https://blog.51cto.com/searchcoding/2319688

你可能感兴趣的文章
(转)一点一点学ASP.NET-HttpHandler
查看>>
Sesame 2.7.0 发布,Java 的 RDF 开发包
查看>>
配置服务Ubuntu 嵌入式开发环境配置,交叉编译环境+tftp+minicom
查看>>
ibatis学习笔记
查看>>
函数元素AndroidInitProcess分析心得(3)
查看>>
ssh之雇员管理系统(2)-hibernate测试
查看>>
[转] JSON数据解析错误处理办法!
查看>>
c# 注册了Ctrl+空格为热键,捕获后发送Ctrl+Shift
查看>>
Android窗口浮在屏幕上效果
查看>>
今天做jquery遇到的一些问题汇总
查看>>
Arcgis中将栅格数据导出成Txt格式
查看>>
基于Predictive Parsing的ABNF语法分析器(五)——AbnfParser文法解析器之单字符的情形(如HTAB、LF、CR、SP)...
查看>>
每日英语:What Makes A Risk-Taker
查看>>
用VC实现发送和接收短信(操作AT指令)
查看>>
android-HttpClient和HttpURLConnection判断网络连接
查看>>
vi使用5
查看>>
html知识点总结
查看>>
POJ 1039 Pipe(直线和线段相交判断,求交点)
查看>>
Java-抽象类定义构造方法
查看>>
一键安装IIS的点点滴滴——For所有Microsoft的操作系统(上)
查看>>