"Identifier" 未声明的标识符
"Identifier" Undeclared Identifier
现在我尝试将代码中的字符集从多字节更改为 unicode,但是当我编译这段代码时出现错误,这是我的错误
error C2065: 'LtszCommConfigFile' : undeclared identifier
我不知道为什么会这样?,我已经声明了 LtszCommConfigFile
标识符,但我仍然遇到错误
这是我的完整代码
CString CCommApiHelper::GetTerminalNum(LPCTSTR lpszCommonPath, BOOL bIsCyber)
{
TCHAR tszCommConfigFile[MAX_PATH] = {0, };
TCHAR tszTermNum[9] = {0, };
CString strTermNum;
_stprintf(tszCommConfigFile, L"%s\CommInfo.ini", lpszCommonPath);
if ( GetPrivateProfileInt(L"TEST_INFO", L"IS_TERM_ID", 0, tszCommConfigFile) == 1 )
{
GetPrivateProfileString(L"TEST_INFO", L"TERM_ID", L"A0000000", tszTermNum, sizeof(tszTermNum), tszCommConfigFile);
strTermNum = tszTermNum;
return strTermNum;
}
int x1, x2, x3, x4;
x1 = GetPrivateProfileIntA("IP_INFO", "A_CLASS", 0, _T(tszCommConfigFile));
x2 = GetPrivateProfileIntA("IP_INFO", "B_CLASS", 0, _T(tszCommConfigFile));
x3 = GetPrivateProfileIntA("IP_INFO", "C_CLASS", 0, _T(tszCommConfigFile));
x4 = GetPrivateProfileIntA("IP_INFO", "D_CLASS", 0, _T(tszCommConfigFile));
if ( (x2 / 10) == 10 ) tszTermNum[1] += '1'; // 105 or 109
else if ( (x2 / 10) == 20 ) tszTermNum[1] += '2'; // 205 or 209
else tszTermNum[1] += '0';
_stprintf(&tszTermNum[2], L"%03d%03d", x3, x4);
strTermNum = tszTermNum;
return strTermNum;
}
谢谢
_T
仅适用于字符串文字(例如“hello world”)。你不能在变量上使用它。
_T
和 TEXT
和 TCHAR
和 LPCTSTR
等是古老的历史,在 1990 年代使用,当时人们想编写同时适用于 [=28] 的代码=] 95 和 Windows XP。根本没有理由在现代代码中使用它们。
改为对窄字符 (ASCII) 使用 char
和相关类型,对宽字符 (Unicode) 使用 wchar_t
和相关类型。
您的具体错误似乎是在您应该使用 GetPrivateProfileIntW
时使用了 GetPrivateProfileIntA
。即
x1 = GetPrivateProfileIntW(L"IP_INFO", L"A_CLASS", 0, tszCommConfigFile);
现在我尝试将代码中的字符集从多字节更改为 unicode,但是当我编译这段代码时出现错误,这是我的错误
error C2065: 'LtszCommConfigFile' : undeclared identifier
我不知道为什么会这样?,我已经声明了 LtszCommConfigFile
标识符,但我仍然遇到错误
这是我的完整代码
CString CCommApiHelper::GetTerminalNum(LPCTSTR lpszCommonPath, BOOL bIsCyber)
{
TCHAR tszCommConfigFile[MAX_PATH] = {0, };
TCHAR tszTermNum[9] = {0, };
CString strTermNum;
_stprintf(tszCommConfigFile, L"%s\CommInfo.ini", lpszCommonPath);
if ( GetPrivateProfileInt(L"TEST_INFO", L"IS_TERM_ID", 0, tszCommConfigFile) == 1 )
{
GetPrivateProfileString(L"TEST_INFO", L"TERM_ID", L"A0000000", tszTermNum, sizeof(tszTermNum), tszCommConfigFile);
strTermNum = tszTermNum;
return strTermNum;
}
int x1, x2, x3, x4;
x1 = GetPrivateProfileIntA("IP_INFO", "A_CLASS", 0, _T(tszCommConfigFile));
x2 = GetPrivateProfileIntA("IP_INFO", "B_CLASS", 0, _T(tszCommConfigFile));
x3 = GetPrivateProfileIntA("IP_INFO", "C_CLASS", 0, _T(tszCommConfigFile));
x4 = GetPrivateProfileIntA("IP_INFO", "D_CLASS", 0, _T(tszCommConfigFile));
if ( (x2 / 10) == 10 ) tszTermNum[1] += '1'; // 105 or 109
else if ( (x2 / 10) == 20 ) tszTermNum[1] += '2'; // 205 or 209
else tszTermNum[1] += '0';
_stprintf(&tszTermNum[2], L"%03d%03d", x3, x4);
strTermNum = tszTermNum;
return strTermNum;
}
谢谢
_T
仅适用于字符串文字(例如“hello world”)。你不能在变量上使用它。
_T
和 TEXT
和 TCHAR
和 LPCTSTR
等是古老的历史,在 1990 年代使用,当时人们想编写同时适用于 [=28] 的代码=] 95 和 Windows XP。根本没有理由在现代代码中使用它们。
改为对窄字符 (ASCII) 使用 char
和相关类型,对宽字符 (Unicode) 使用 wchar_t
和相关类型。
您的具体错误似乎是在您应该使用 GetPrivateProfileIntW
时使用了 GetPrivateProfileIntA
。即
x1 = GetPrivateProfileIntW(L"IP_INFO", L"A_CLASS", 0, tszCommConfigFile);