警告:已弃用从字符串常量转换为'char *''

时间:2011-09-19 08:35:18

标签: c++ compiler-warnings

  

可能重复:
  How to get rid of deprecated 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编译器

3 个答案:

答案 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);