可能重复:
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__);
我的问题是摆脱上述警告的最佳方法是什么?
答案 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)
{
//...
}