GCC:为字符串输出自定义printf

时间:2012-12-02 23:49:28

标签: gcc printf

GCC allows customization of printf specifiers.但是,我不知道如何“教”它接受%s说明符的字符串类。我的字符串类是char指针的简单包装器,只有一个成员变量(char * data),没有虚函数。因此,可以将其原样传递给类似printf的函数,而不是常规的char *。问题是gcc静态分析器阻止我这样做,我必须明确地将其强制转换为const char *以避免警告或错误。

我的cstring看起来像这样:

class cstring
{
   cstring() : data(NULL){}
   cstring(const char * str) : data(strdup(str)){}
   cstring(const cstring & str) : data(strdup(str.data)){}
   ~cstring()
   {
        free(data);
   }
   ...
   const char * c_str() const
   {
        return data;
   }

private:
   char * data;
};

使用cstring的示例代码:

cstring str("my string");
printf("str: '%s'", str);

在GCC上我收到此错误:
错误:无法通过'...'传递非平凡可复制类型'class cstring'的对象 错误:格式'%s'需要类型'char *'的参数,但参数1的类型为'cstring'[-Werror = format]
cc1plus.exe:所有警告都被视为错误

1 个答案:

答案 0 :(得分:1)

C ++标准不要求编译器支持这种代码,并且并非所有版本的gcc都支持它。 (https://gcc.gnu.org/onlinedocs/gcc/Conditionally-supported-behavior.html表明gcc-6.0至少是一个开放的问题,它是否适用于这里的类。)

C ++ 11标准中的相关部分是5.2.2第7节:

  

当给定参数没有参数时,参数的传递方式是接收函数可以通过调用va_arg来获取参数的值...   传递类型的潜在评估参数(第9条)   有一个非平凡的复制构造函数,一个非平凡的移动构造函数,   或者是一个没有相应参数的非平凡的析构函数   有条件地支持实现定义的语义。

(但从好的方面来看:如果你养成使用c_str的习惯,那么至少当你使用std::string时,你不会被绊倒。)