【问题标题】:How should I properly use __attribute__ ((format (printf, x, y))) inside a class method in C++?我应该如何在 C++ 的类方法中正确使用 __attribute__ ((format (printf, x, y)))?
【发布时间】:2012-07-22 04:35:27
【问题描述】:

我正在尝试为调试打印定义一个类方法,其行为类似于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 不是我要打印的字符串的一部分?

【问题讨论】:

  • 可以使用可变参数模板吗?如果是这样,您可以创建一个type safe printf
  • 不要想太多this。这不是一个明确的论点,句号。只需遵循 GCC 手册,其中说对于成员函数,您必须将 1 添加到 format-attribute 参数。这只是一个不透明的规则,由编译器扩展的供应商提供给您。
  • printf (2, 3) 是对的。定义“看起来像移位”...?
  • format 属性指定格式字符串的样式、格式字符串的参数位置以及... 的参数位置。然后编译器使用该信息对带有格式字符串的... 参数进行类型检查。
  • 呃!即使使用 gcc 6.2,错误仍然很神秘......

标签: c++ gcc printf string-formatting


【解决方案1】:

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

【讨论】:

  • 有道理,但我想知道为什么没有记录在任何地方
  • 你是对的here由于非静态 C++ 方法具有隐含的 this 参数,因此在为 string- 赋值时,此类方法的参数应该从两个开始计算,而不是一个索引和首先检查。
【解决方案2】:

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

  • 非成员函数适用于 1,2
  • 静态成员函数适用于 1,2
  • 非静态成员函数把'this'当作#1,所以需要2,3

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 总的来说这是一个好点,但对我来说这不是问题,因为这是使用严格流程构建的内部代码库。
    • 你也可以使用#ifndef __GNUC__ #define __attribute__(a)。然后你可以使用任何属性。
    • 它实际上也适用于clang,按照设计,它与gcc 兼容。 “它旨在充当 GNU 编译器集合 (GCC) 的直接替代品,支持其大部分编译标志和非官方语言扩展。” (Wikipedia)。
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多