34

我正在尝试为调试打印定义一个类方法,其行为类似于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

4 回答 4

34

你已经做到了。 this是参数 1,所以通过说format(printf, 2, 3)您告诉编译器您没有打印this,您正在打印参数 2 ( fmt) 以及除此之外的其他参数。

于 2012-07-23T21:53:10.563 回答
4

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

  • 非成员函数使用 1,2
  • 静态成员函数使用 1,2
  • 非静态成员函数将 'this' 视为 #1,因此需要 2,3

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

于 2015-12-16T16:19:52.653 回答
2

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

#ifdef __GNUC__
          __attribute__ (( format( printf, 2, 3 ) ))
#endif
于 2013-09-09T02:11:18.870 回答
2

@Chris Dodd 是正确的。这是支持它的最新 gcc 文档(感谢Foxit 阅读器让我在 Linux 上标记 PDF)。特别注意下图中绿色标记的部分。

由于非静态 C++ 方法有一个隐含的 this 参数,因此在为 和 赋值时,此类方法的参数应该从2开始计算,而不是从 1 开始。string-indexfirst-to-check

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

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

在此处输入图像描述

于 2019-01-15T01:16:25.497 回答