消除从字符串常量到‘char*’的弃用转换的最佳方法”
Best way to eliminate deprecated conversion from string constant to ‘char*’"
我遇到过如下情况,我收到编译器的以下警告。
Main.cpp:14:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Login(USER,PASSWORD);
这是代码
Passwords.h
#define USER "user"
#define PASSWORD "pass"
Main.cpp
#include <iostream>
#include "Passwords.h"
using namespace std;
void Login(char* username,char* password)
{
cout << "UserName is " << username <<endl;
cout << "Password is " << password <<endl;
}
int main()
{
Login(USER,PASSWORD);
return 0;
}
我决定做的一件事是在 Passwords.h 文件中引入一个全局变量。但我真的很想知道解决这个问题的最佳做法是什么。
我希望没有人将此标记为重复,因为有人问了同样的问题。我需要以合法的方式消除此警告并寻找最佳实践,因为针对同一问题的许多答案都提供了一些技巧来关闭编译器警告和一些强制转换解决方案。
更新
Login 函数实际上是一个虚函数,因此参数数据类型无法从char *
更改为const char*
。为了简单起见,我使用了特定的代码段。
就这样
void Login(const char* username, const char* password)
当你在上面时,将 define
替换为 constexpr
。
But I really like to know what is the best practice to solve this issue.
最佳做法是在不对指向的 object/array 进行任何修改的情况下使用 pointers/references 进行 const。您应该对参数进行以下更改:
void Login(const char* username, const char* password)
从字符串字面量到 const char*
的转换是 well-formed 且未弃用。
the parameter datatypes cannot be changed from char *
to const char*
您的要求不包括上面显示的最佳做法。鉴于此限制,您不应将字符串文字传递给函数。剩下的选项是解决方法。我建议的解决方法是创建文字的本地副本,然后传递它:
char user[] = USER;
char pass[] = PASSWORD;
Login(user,pass);
PS。从 C++11 开始,从字符串文字到 char*
的转换不仅被弃用,而且 ill-formed 被弃用。符合现行标准的编译器可能会拒绝编译该程序。
PPS。正如评论中所指出的,从安全角度来看,将密码作为纯文本存储在可执行文件中(这是字符串文字的存储方式)是可疑的。
鉴于您无法将函数签名更改为更合适的内容,您被卡住了。糟糕的代码迫使更多的糟糕代码。
在这种情况下,您需要将字符串复制到不是 const
的内容。
int main()
{
char user[] = USER;
char password[] = PASSWORD;
Login(user,password);
return 0;
}
我遇到过如下情况,我收到编译器的以下警告。
Main.cpp:14:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Login(USER,PASSWORD);
这是代码 Passwords.h
#define USER "user"
#define PASSWORD "pass"
Main.cpp
#include <iostream>
#include "Passwords.h"
using namespace std;
void Login(char* username,char* password)
{
cout << "UserName is " << username <<endl;
cout << "Password is " << password <<endl;
}
int main()
{
Login(USER,PASSWORD);
return 0;
}
我决定做的一件事是在 Passwords.h 文件中引入一个全局变量。但我真的很想知道解决这个问题的最佳做法是什么。
我希望没有人将此标记为重复,因为有人问了同样的问题。我需要以合法的方式消除此警告并寻找最佳实践,因为针对同一问题的许多答案都提供了一些技巧来关闭编译器警告和一些强制转换解决方案。
更新
Login 函数实际上是一个虚函数,因此参数数据类型无法从char *
更改为const char*
。为了简单起见,我使用了特定的代码段。
就这样
void Login(const char* username, const char* password)
当你在上面时,将 define
替换为 constexpr
。
But I really like to know what is the best practice to solve this issue.
最佳做法是在不对指向的 object/array 进行任何修改的情况下使用 pointers/references 进行 const。您应该对参数进行以下更改:
void Login(const char* username, const char* password)
从字符串字面量到 const char*
的转换是 well-formed 且未弃用。
the parameter datatypes cannot be changed from
char *
toconst char*
您的要求不包括上面显示的最佳做法。鉴于此限制,您不应将字符串文字传递给函数。剩下的选项是解决方法。我建议的解决方法是创建文字的本地副本,然后传递它:
char user[] = USER;
char pass[] = PASSWORD;
Login(user,pass);
PS。从 C++11 开始,从字符串文字到 char*
的转换不仅被弃用,而且 ill-formed 被弃用。符合现行标准的编译器可能会拒绝编译该程序。
PPS。正如评论中所指出的,从安全角度来看,将密码作为纯文本存储在可执行文件中(这是字符串文字的存储方式)是可疑的。
鉴于您无法将函数签名更改为更合适的内容,您被卡住了。糟糕的代码迫使更多的糟糕代码。
在这种情况下,您需要将字符串复制到不是 const
的内容。
int main()
{
char user[] = USER;
char password[] = PASSWORD;
Login(user,password);
return 0;
}