我正在尝试为调试打印定义一个类方法,其行为类似于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
不是要打印的字符串的一部分?
4条答案
按热度按时间h4cxqtbf1#
你已经做到了,
this
是参数1,所以通过说format(printf, 2, 3)
,你告诉编译器你不是在打印this
,你是在打印参数2(fmt
),在参数2之后还有其他参数。sd2nnvve2#
把静态成员和非成员一样对待。讨论给了我答案,但值得其他人注意:
*static成员函数使用1,2
*非静态成员函数将'this'视为#1,因此需要2,3
我发现这一点是因为我们有一些进程使用类似这样的日志助手,其中四个进程中有一个需要
__attribute__ (( format( printf, 2, 3 ) ))
,而其他三个进程可以很好地使用__attribute__ (( format(printf, 1, 2) ))
-结果发现它是非静态的...sbdsn5lh3#
由于它只适用于gcc,因此最好以这种方式定义它,以避免在其他编译器上出现错误。
tzxcd3kk4#
@Chris Dodd是正确的。这里有最新的gcc文档来支持它(感谢Foxit reader让我在Linux上标记PDF)。特别注意下图中绿色标记的部分。
由于非静态C++方法具有隐含的this参数,因此在指定
string-index
和first-to-check
的值时,这类方法的参数应该从2开始计数,而不是从1开始计数。来源:https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes(参见标题为“格式(原型、字符串索引、第一个检查)”的部分)。
图像(特别是绿色高亮显示):