从字符串常量到 '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]

为啥从字符串常量转换为 'char*' 在 C 中有效但在 C++ 中无效

C语言字符数组转换字符串

C++ 不推荐将字符串常量转换为 'char*'

带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复]