2

GCC允许定制 printf 说明符。但是,我看不到如何“教”它接受我的字符串类作为%s说明符。我的字符串类是对 char 指针的简单包装,并且只有一个成员变量(char * 数据)并且没有虚函数。因此,可以将它按原样传递给类似 printf 的函数来代替 regular 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:所有警告都被视为错误

4

1 回答 1

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。)

于 2012-12-03T00:05:03.300 回答