从字符串常量到 'char*' 的折旧转换
Posted
技术标签:
【中文标题】从字符串常量到 \'char*\' 的折旧转换【英文标题】:Depreciated conversion from string constant to 'char*'从字符串常量到 'char*' 的折旧转换 【发布时间】:2014-03-28 21:53:16 【问题描述】:我希望有人可以帮助我。我正在将 C 语言程序转换为 C++,以便轻松使用字符串,但是当我去编译时,我得到了这个错误:
inventory.cpp:225: warning: depreciated conversion from string constant to 'char*'
这是有问题的代码:
#define FNAME "database.dat"
// test data struct
struct t_Record
int number;
char word[100];
//String word[];
Record;
int main (void)
int Rec = 0; // record number
FILE *File;
srand(time(NULL));
File = FileOpen(FNAME);
if (!File)
printf("Error hommie!\n\n");
exit(-1);
...etc.
这是编译器告诉我发生错误的地方:
File = FileOpen(FNAME);
我只是看不出有什么问题......
编译器告诉我要查看的地方甚至没有与之关联的字符串或字符??
现在我知道这个错误之前已经出现过,但我的问题是针对我的代码的。
【问题讨论】:
你需要查看FileOpen
函数的函数原型。它期望什么类型的论点?
如果FileOpen
期望char*
不打算修改传递的字符数据,把作者打得头破血流,因为那个参数应该是char const*
。
以前从不知道编译器会贬低任何东西......
@Deduplicator:编译器没有;语言标准做到了。
这看起来像是一条 g++ 错误消息——除了实际消息使用“deprecated”这个词,而不是“depreciated”。您似乎重新输入了错误消息,而不是复制并粘贴它。请复制并粘贴 exact 错误消息。像这样的细微差别可能非常重要(尽管这可能不是)。
【参考方案1】:
问题是您正在尝试将string literal(类型为const char[]
)转换为char*
。
编译器告诉我要查看的地方甚至没有 与之关联的字符串或字符??
是的,它在文件的顶部:
#define FNAME "database.dat"
C++ 标准 n3337 § 2.14.5/1
字符串字面量
字符串字面量是一个字符序列(定义见 2.14.3) 用双引号括起来,可选前缀 R, u8, u8R, u, uR, U、UR、L 或 LR,如 "..."、R"(...)"、u8"..."、u8R"(...)"、u"..."、 uR"* ̃(...)* ̃", U"...", UR"zzz(...)zzz", L"...", 或 LR"(...)", 分别。
您可以通过转换为 char*
来避免警告:
File = FileOpen( (char*)FNAME);
更好地修改FileOpen
以接受const char*
。由于您不打算修改字符串,因此这将更加安全和正确。
【讨论】:
更好的是,修改FileOpen
以接受const char*
就像一个好公民。
使用你的修改我在其他方法中遇到了很多其他错误。我回家后会尝试调试...会更新你们,谢谢。
*函数不是方法
@mosawi 只是将 FileOpen 的签名更改为 const char* 而不是 char*,其他错误与 FileOpen 无关
是的,我确实这样做了,但是由于依赖关系,我在使用其他函数时遇到了错误。我想我应该发布所有代码,这样你们就可以看到我在做什么【参考方案2】:
正如@lizusek 所说,您可以通过类型转换为char*
来避免警告,但更好的是重写您的代码以避免类型转换。虽然它可以工作并解决很多令人头疼的问题,但如果您键入错误的内容,则可能会非常危险。
【讨论】:
以上是关于从字符串常量到 'char*' 的折旧转换的主要内容,如果未能解决你的问题,请参考以下文章
如何摆脱 GCC 中“从字符串常量到‘char*’的不推荐转换”警告?
C++ 警告:不推荐使用从字符串常量到“char*”的转换 [-Wwrite-strings]