因此,我从来不知道收到这样的警告时该怎么做,所以我需要其他专业程序员的建议。当我收到某种警告(不是错误)时
(省略其他上下文代码)
wchar_t pszName[CREDUI_MAX_USERNAME_LENGTH + 1] = L"user";
wchar_t pszPwd[CREDUI_MAX_PASSWORD_LENGTH + 1] = L"password";
// ..
COAUTHIDENTITY authIdent;
// ...
memset(&authIdent, 0, sizeof(COAUTHIDENTITY));
authIdent.PasswordLength = wcslen(pszPwd);
authIdent.UserLength = wcslen(pszName);
问题显然是wcslen()返回size_t和authIdent.PasswordLength是ULONG。最好的方式来处理这样的警告?他们有希望我使用的winapi函数而不是wcslen()吗?
编辑:谢谢大家的所有好评!
最佳答案
字符串长度最自然的类型是size_t
。实际上,字符串的大小将同时适合ULONG
和size_t
。但是,这样的任务绝对值得警告。想象一下这个愚蠢的错误:
ULONG x = 0;
authIdent.PasswordLength = x - 1;
很容易断言这种错误永远不会发生,但是通过提供一个不太容易出错的界面来防止这种错误也很容易(这也防止了丑陋的
memset
出现在用户代码中):struct my_COAUTHIDENTITY {
private:
COAUTHIDENTITY authIdent;
public:
my_COAUTHIDENTITY() {
memset(&authIdent, 0, sizeof(COAUTHIDENTITY));
}
void setPasswd(wstring passwd) {
...
authIdent.PasswordLength = static_cast<ULONG>(passwd.size());
}
};