c++ - 警告 : deprecated conversion from string constant to 'char*' '

标签 c++ compiler-warnings

Possible Duplicate:
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 编译器

最佳答案

处理未知库

当传递文字而不是其他 const 字符串时,并且您不确定库是否正在修改字符串,很容易在 C++ 中创建一个堆栈分配的文字临时拷贝(受 How to get rid of `deprecated conversion from string constant to ‘char*’` warnings in GCC? 启发):

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

使用显式转换来解决弱库原型(prototype)

在大多数编译器上,显式转换会避免警告,例如:

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

注意:只有当你确定函数确实从不修改传递的字符串时(即函数可以声明为 const char *,但事实并非如此,可能是因为库编写者忘记添加它)。尝试修改字符串文字是一种未定义的行为,并且在许多平台上会导致崩溃。如果您不确定,则需要制作字符串的可写拷贝,当您知道字符串大小的某个上限时,该拷贝可能是动态分配的,甚至是堆栈分配的。

关于c++ - 警告 : deprecated conversion from string constant to 'char*' ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7468286/

相关文章:

ios - 修复警告 : cannot pair a synthesized setter/getter with a user defined setter/getter

C++ - 如何将对象推送到 std::shared_ptr 的 std::stack ?

maven-3 - 编译scala时maven "rerun with -feature"

c++ - 使用 float 的系列总和

c++ - 四边形的面积

rust - 如何在 Rust 中禁用未使用的代码警告?

带有 void 指针参数的回调会产生警告

java - 测试中未使用/已使用的常量

c++ - 从模板特化中获取对类成员的访问

C++ 和 C 文件 I/O