弃用从字符串到 char * 的转换

deprecated conversion from string to char *

我想从命令行获取文件名或为其设置默认名称。所以,之前我用

static char *fName;
if (argc == 2 ) {
    fName = argv[1];
}
else {
    fName = "default_file.txt";
}

但是对于 else,我得到 warning: conversion from a string literal to "char *" is deprecated。如果我尝试这样的事情:

static char fName [30] = "default_file.txt";
if (argc == 2 ) {
    fName = argv[1]; //error
}

现在,我得到 error: expression must be a modifiable lvalue。那么,我该如何解决?

warning: conversion from a string literal to "char *" is deprecated

这几乎可以肯定意味着您正在使用 C++ 编译器。字符串文字(如示例中的 "default_file.txt" )在 C 和 C++ 中都曾经是 char[] 类型。写入字符串文字会调用未定义的行为。因此,C++ 将字符串文字的类型更改为 const char[]。但在 C 中,类型仍然是 char[]。因此,该警告表明您正在使用 C++ 编译器来编译 C 代码,这通常是不明智的。

请注意,在 C 和 C++ 中使用非 const 限定的指向字符串文字的指针是不好的做法。


Now, I get error: expression must be a modifiable lvalue.

因为您无法使用赋值运算符在 运行 时间内为数组赋值。 C 语法不允许这样做。您将不得不使用 memcpy、strcpy 或类似的工具。


更正后的代码应该是这样的:

static const char* fName = "default_file.txt";

if (argc == 2 ) {
   fName = argv[1];
}

这对 C 和 C++ 都很好,但在 C++ 中建议使用 std::string 代替。