Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC:为字符串输出定制printf_Gcc_Printf - Fatal编程技术网

GCC:为字符串输出定制printf

GCC:为字符串输出定制printf,gcc,printf,Gcc,Printf,但是,我不知道如何“教”它接受%s说明符的字符串类。我的string类是一个简单的char指针包装器,只有一个成员变量(char*data),没有虚拟函数。因此,可以按原样将其传递给printf类函数,而不是常规的char*。问题是,在gcc上,静态分析器阻止我这样做,我必须显式地将其转换为const char*,以避免警告或错误 我的cstring看起来像这样: class cstring { cstring() : data(NULL){} cstring(const char

但是,我不知道如何“教”它接受
%s
说明符的字符串类。我的string类是一个简单的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]

Cc1. PLUES.EX:所有警告都被当作错误:BR/>

> P> C++标准不需要编译器支持这种代码,而不是GCC的所有版本都支持它。(这表明gcc-6.0至少可以——这是一个悬而未决的问题,它是否可以与这里的类一起工作。)

C++11标准中的相关章节为5.2.2第7节:

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

(但要看到好的一面:如果你养成了使用
c_str
的习惯,那么至少你不会在使用
std::string
时绊倒。)