我正在尝试为调试打印定义一个类方法,其行为类似于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
不是我要打印的字符串的一部分?
答案 0 :(得分:19)
你做到了。 this
是参数1,所以通过说format(printf, 2, 3)
你告诉编译器你没有打印this
,你打印参数2(fmt
)过去的争论。
答案 1 :(得分: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(请参见标题为“格式(原型,字符串索引,首先检查)”的部分。)
图片(尤其是绿色突出显示):