弃用从字符串到 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
代替。
我想从命令行获取文件名或为其设置默认名称。所以,之前我用
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
代替。