web-dev-qa-db-ja.com

警告:文字列定数から「char *」への非推奨の変換

可能性のある複製:
GCCのdeprecated conversion from string constant to ‘char*’警告を取り除く方法

私は変更できないライブラリから次の関数を使用します:

HRESULT DynamicTag(char * pDesc, int * const pTag ); 

以下のように使います。上記の機能を実装するライブラリが提供するクラスのオブジェクトを作成しました。

int tag =0;
g_pCallback->DynamicTag("MyLogger", &tag);

次の警告が表示されます。

warning: deprecated conversion from string constant to 'char*'

上記の警告を取り除く最善の方法は何ですか?メモリを動的に割り当てたくありません。

Info:Vxworks6.8コンパイラを使用しています

17
venkysmarty

未知のライブラリを扱う

リテラルを渡し、他のconst文字列ではなく、ライブラリが文字列を変更しているかどうかがわからない場合、C++でリテラルの一時割り当てコピーをスタックに割り当てて簡単に作成できます( 文字列定数からGCCの 'char *' `警告への変換? ):

char strMyLogger[]="MyLogger";
g_pCallback->DynamicTag(strMyLogger, &tag);

明示的なキャストを使用して、弱いライブラリプロトタイプを回避する

ほとんどのコンパイラでは、明示的な変換によって次のような警告が回避されます。

 g_pCallback->DynamicTag(const_cast<char *>("MyLogger"), &tag);

注:これは、関数が渡された文字列を実際に変更しないことが確実である場合にのみ使用できます(つまり、関数がconst char *として宣言された可能性がありますが、そうではありません。おそらく、ライブラリライターが追加するのを忘れたためです)。文字列リテラルを変更しようとすると、動作が未定義になり、多くのプラットフォームでクラッシュが発生します。不明な場合は、文字列サイズの上限がわかっているときに、文字列の書き込み可能なコピーを作成する必要があります。

17
Suma

DynamicTagを変更できない場合、それを呼び出す方法を変更する必要があります。たとえば、次のように使用できます。

char descr[] = "MyLogger";
g_pCallback->DynamicTag(descr, &tag);

与えられたpDescが[in]引数として宣言されていると、おそらく変更されないため、constをキャストしなくても済むかもしれませんが、それは悪い習慣です。

2
eran

その値を配列として渡します。

int tag =0;
char arr[] = "MyLogger";
g_pCallback->DynamicTag(arr, &tag);
1
iammilind