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

ven*_*rty 3 c++ coding-style compiler-warnings

可能重复:
C++不推荐将字符串常量转换为'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__);
Run Code Online (Sandbox Code Playgroud)

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

Lin*_*cer 11

如果函数采用a char const *,则保证它只读取指针指向的任何数据.但是,如果它需要一个非const指针char *,它可能会写入它.

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

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


Jan*_*n S 7

char cMessage[] = "add reorganize failed";
Run Code Online (Sandbox Code Playgroud)

这应该摆脱警告.

  • @Lindydancer:那么你的替代方案是什么,因为这个功能无法改变,我们不知道它的作用是什么?这个答案是对的.如果有更多可用的信息可以节省22个字节(或一旦填充24个字节),以及复制那么多数据的时间和代码,那就太好了.在受限制的环境中进行编程可能会认为值得检查以确保函数不会修改数据.但是,当它几乎总是没有时,通过将那段时间和记忆称为"珍贵",我们不要过度销售. (6认同)
  • @Lindydancer如果函数需要char*,则需要char*.有什么替代品?(除了更改功能签名) (5认同)
  • @Lindydancer:关于宝贵的资源,22字节的RAM花费大约2*10 ^ -5的一分钱.如果函数采用非const char*会有任何危险,因为它会修改数据,那么复制字符串文字是必不可少的.慢速,正确的代码比尝试修改字符串文字的快速代码更好. (5认同)
  • 这将创建一个位于RAM中的字符数组,这将占用宝贵的资源并消耗初始化的时间. (2认同)
  • @Lindydancer:我会注意到消息可以很容易地变成静态的,以避免堆栈浪费等......不应该对函数体做出假设,签名是唯一的契约. (2认同)

归档时间:

查看次数:

12639 次

最近记录:

13 年,6 月 前