编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配

  

背景

  

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

  

参考文献:https://www.cnblogs.com/marvin-notes/p/4482805.html感谢原作者

  

方法

  

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

  

语法:格式(string-index原型,首先要检查)

  
 <代码>原型:printf, scanf, strftime或strfmon,表示按照那种风格进行检查
  string-index:传入参数的第几个参数是格式化字符串,就是“% s % d”的下标(从1开始)
  首先要检查:指定从函数的第几个参数开始校验 
  

实例:   

 <代码> __attribute__((格式(printf, m, n)))  
  

m:第几个参数为格式化字符串(格式字符串)
n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几。这里需要注意,有时函数参数里还有“隐身”的,如c++的类成员函数的第一个参数实际上是“隐身“的“this"指针;

  

代码实例

  
 <代码> # include & lt; stdarg.h>
  # include & lt; string>
  # include & lt; stdio.h>
  
  使用名称空间性病;
  
  #定义mm_p (fmt, args…) myprint (fmt, args)
  空白myprint (const char * fmt,…)使用__attribute__((格式(printf, 1, 2)));
  空白myprint (const char * fmt,…)
  {
  va_list美联社;
  fmt va_start(美联社);
  函数(fmt,美联社);
  va_end(美联社);
  }
  
  struct党卫军
  {
  公众:
  空白pri (const char * fmt,…)使用__attribute__((格式(printf、2、3)))
  {
  }
  };
  int main ()
  {
  
  mm_p (“dfjkaj [% d] [% s] \ n ", 123456);
  myprint (“dfjkaj [% d] [% d] \ n ", 123456);
  
  学生年代;
  年代。pri (“% s [% s”、“弟弟”,456);
  } 
  
 <代码> g++ - wall test_var。cpp - o test_var
  test_var。cpp: int主要()的函数:
  test_var。cpp: 27:警告:格式“% s”预计的char *类型,但论点3型“int”
  test_var。cpp: 31:警告:格式“% s”预计的char *类型,但参数4类型“int” 

编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配