可能重复:
How to get rid ofdeprecated conversion from string constant to ‘char*’
warnings in GCC?
我使用库中的以下功能,我无法改变:
HRESULT DynamicTag(char * pDesc, int * const pTag );
我按如下方式使用它。我创建了实现上述函数的库提供的类的对象。
int tag =0;
g_pCallback->DynamicTag("MyLogger", &tag);
我收到以下警告:
warning: deprecated conversion from string constant to 'char*'
摆脱上述警告的最佳方法是什么?我不想动态分配内存。
信息:我使用的是Vxworks6.8编译器
答案 0 :(得分:17)
当传递文字而不是其他const字符串时,你不确定该库是否修改了字符串,很容易在C ++中创建一个堆栈分配的文字临时副本(灵感来自How to get rid of `deprecated conversion from string constant to ‘char*’` warnings in GCC?):< / p>
char strMyLogger[]="MyLogger";
g_pCallback->DynamicTag(strMyLogger, &tag);
在大多数编译器中,显式转换会避免警告,例如:
g_pCallback->DynamicTag(const_cast<char *>("MyLogger"), &tag);
注意:只有当你确定函数真的永远不会修改传递的字符串时(即当函数可以声明为const char *时,但它不是,可能是因为库编写者忘记添加)时,你可以使用它它)。尝试修改字符串文字是一种未定义的行为,并且在许多平台上它会导致崩溃。如果您不确定,当您知道字符串大小的某个上限时,您需要制作字符串的可写副本,该副本可以动态分配,甚至可以堆栈分配。
答案 1 :(得分:2)
鉴于您无法更改DynamicTag
,您必须更改调用它的方式。您可以使用,例如:
char descr[] = "MyLogger";
g_pCallback->DynamicTag(descr, &tag);
鉴于pDesc被声明为[in]参数意味着它可能不会被更改,所以你可能会将const转换掉,但这是一个坏习惯。
答案 2 :(得分:1)
将该值作为数组传递。
int tag =0;
char arr[] = "MyLogger";
g_pCallback->DynamicTag(arr, &tag);