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

b0zn9rqh  于 2022-11-13  发布在  其他
关注(0)|答案(4)|浏览(174)

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

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

当我用-Wformat-Wall编译时,This会抱怨:

error: format string argument not a string type

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

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

现在它编译了,但是看起来参数被移位了,就像this参数被当作参数列表的一部分一样。
如何告诉函数this不是要打印的字符串的一部分?

h4cxqtbf

h4cxqtbf1#

你已经做到了,this是参数1,所以通过说format(printf, 2, 3),你告诉编译器你不是在打印this,你是在打印参数2(fmt),在参数2之后还有其他参数。

sd2nnvve

sd2nnvve2#

把静态成员和非成员一样对待。讨论给了我答案,但值得其他人注意:

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

我发现这一点是因为我们有一些进程使用类似这样的日志助手,其中四个进程中有一个需要__attribute__ (( format( printf, 2, 3 ) )),而其他三个进程可以很好地使用__attribute__ (( format(printf, 1, 2) ))-结果发现它是非静态的...

sbdsn5lh

sbdsn5lh3#

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

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

tzxcd3kk4#

@Chris Dodd是正确的。这里有最新的gcc文档来支持它(感谢Foxit reader让我在Linux上标记PDF)。特别注意下图中绿色标记的部分。
由于非静态C++方法具有隐含的this参数,因此在指定string-indexfirst-to-check的值时,这类方法的参数应该从2开始计数,而不是从1开始计数。

来源:https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes(参见标题为“格式(原型、字符串索引、第一个检查)”的部分)。
图像(特别是绿色高亮显示):

相关问题