GCC: 自定义printf输出字符串

3
GCC 允许自定义printf格式说明符。然而,我不知道如何“教”它接受我的字符串类作为%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个回答

2
C++标准不要求编译器支持这种代码,也不是所有版本的gcc都支持它。(https://gcc.gnu.org/onlinedocs/gcc/Conditionally-supported-behavior.html建议至少gcc-6.0支持,但对于像这里这样的类是否能正常工作还存在疑问。)
C++11标准中相关的部分是5.2.2第7节:
当给定参数没有参数时,该参数被传递的方式使得接收函数可以通过调用va_arg来获取参数的值... 传递具有非平凡复制构造函数、非平凡移动构造函数或非平凡析构函数的类类型(第9条)的可能评估的参数,而没有相应的参数,则在实现定义语义下是有条件支持的。
(但看到好的一面:如果你养成使用的习惯,那么至少在使用std::string时就不会被绊倒了。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接