GCCでは、printf 指定子をカスタマイズできます。ただし、指定子として文字列クラスを受け入れるように「教える」方法がわかりません%s
。私の文字列クラスは、char ポインターに対する単純なラッパーであり、メンバー変数 (char * data) が 1 つだけあり、仮想関数はありません。したがって、通常の代わりに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: すべての警告がエラーとして扱われます