因此,我从来不知道收到这样的警告时该怎么做,所以我需要其他专业程序员的建议。当我收到某种警告(不是错误)时



(省略其他上下文代码)

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。实际上,字符串的大小将同时适合ULONGsize_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());
        }
 };

10-04 10:43