不推荐使用从字符串常量转换为char *错误

时间:2011-09-14 11:08:42

标签: c++ coding-style compiler-warnings

  

可能重复:
  C++ deprecated conversion from string constant to ‘char*’

我有以下代码,但我没有复制完整代码,因为它很大。 以下代码在模板类中,我收到如下警告。由于模板中的警告,我无法实例化它并从此处“实例化”错误。

  

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

void ErrorMessageInRaphsodyCode(char* pcCompleteMessage, char* pcMessage, char* pcFileName, unsigned int RowNo)
{
//...
}


char cCompleteMessage[200];
memset(cCompleteMessage, 0x00, sizeof(cCompleteMessage));
char*cMessage = "add reorgenize failed";
ErrorMessageInRaphsodyCode(cCompleteMessage, cMessage, "omcollec.h", __LINE__);

我的问题是摆脱上述警告的最佳方法是什么?

5 个答案:

答案 0 :(得分:11)

如果函数采用char const *,则它保证它只读取指针指向的任何数据。但是,如果它采用非常量指针,如char *,它可能会写入它。

由于写入字符串文字是不合法的,编译器会发出警告。

最佳解决方案是将功能更改为接受char const *而不是char *

答案 1 :(得分:7)

char cMessage[] = "add reorganize failed";

这应该摆脱警告。

答案 2 :(得分:2)

摆脱它的最佳方法是修复带参数的函数。

如果你的代码是正确的并且函数确实采用字符串常量,那么它应该在其原型中这样说:

void ErrorMessageInRaphsodyCode(char* pcCompleteMessage, char* pcMessage, const char* pcFileName, unsigned int RowNo)

如果你不能这样做(你没有代码),你可以创建一个内联包装器:

inline void ErrorMessageInRaphsodyCodeX(char* p1, char* p2, const char* p3, unsigned int p4)
{  ErrorMessageInRaphsodyCode(p1,p2,(char*)p3,p4); }

并改为使用包装器。

如果您的代码不正确并且该函数实际上需要可写内存(我非常怀疑),您将需要通过创建Jan建议的本地数组或malloc足够的内存来使字符串可写

答案 3 :(得分:0)

c_str()类的std::string函数。

答案 4 :(得分:0)

(1)将变量设为const char*

(..., const char* pcFileName, ...)

(2)如果无法执行以上操作,并且您希望保留char*const char*的状态,那么请将该函数设为template

template<typename CHAR_TYPE>  // <--- accepts 'char*' or 'const char*'
void ErrorMessageInRaphsodyCode(char* pcCompleteMessage, CHAR_TYPE* pcMessage, char* pcFileName, unsigned int RowNo)
{
//...
}