我应该如何在C ++的类方法中正确使用__attribute __((format(printf,x,y)))?

时间:2012-07-23 21:46:55

标签: c++ gcc printf string-formatting

我正在尝试为调试打印定义一个类方法,其行为类似于printf

inline void debug(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)))

抱怨:

error: format string argument not a string type

我记得类方法声明有一个隐式this参数,所以我将参数的位置更改为2,3:

inline void debug(const char* fmt, ...) __attribute__ ((format (printf, 2, 3)))

现在它编译了,但看起来参数被移动了,好像this参数被视为参数列表的一部分。

如何告诉函数this不是我要打印的字符串的一部分?

4 个答案:

答案 0 :(得分:19)

你做到了。 this是参数1,所以通过说format(printf, 2, 3)你告诉编译器你没有打印this,你打印参数2(fmt)过去的争论。

答案 1 :(得分:3)

将静态成员视为与非成员相同。讨论给了我答案,但值得注意的是其他人:

  • 非会员功能与1,2
  • 一起使用
  • 静态成员函数适用于1,2
  • 非静态成员函数将'this'视为#1,因此需要2,3

我发现这是因为我们有一些使用这样的日志帮助程序的进程,4个中的1个需要__attribute__ (( format( printf, 2, 3 ) )),而其他三个与__attribute__ (( format(printf, 1, 2) ))一起使用 - 结果证明它是非静态的。 ..

答案 2 :(得分:2)

因为它只适用于gcc,所以最好以这种方式定义它以避免其他编译器出错。

#ifdef __GNUC__
          __attribute__ (( format( printf, 2, 3 ) ))
#endif

答案 3 :(得分:1)

@Chris Dodd is correct。这是备份的最新gcc文档(感谢Foxit reader,让我在Linux上标记PDF)。请特别注意下图中以绿色标记的部分。

  

由于非静态C ++方法具有隐式的this参数,因此当为string-index和{{1}赋值时,此类方法的参数应从 2 (而不是一个)开始计数}。

来源https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes(请参见标题为“格式(原型,字符串索引,首先检查)”的部分。)

图片(尤其是绿色突出显示):

enter image description here