Мне вспоминается, когда я впервые начал изучать программирование на языке Basic, и в какой-то момент я написал
if X=3 OR 4
Я намеревался сделать это так, как вы описываете, если X равен 3 или 4. Компилятор интерпретировал это как:
if (X=3) OR (4)
То есть, если X = 3 верно, или если 4 верно. Так как он определил все ненулевое значение как истинное, 4 - это истина, все ИЛИ ИСТИНА - это истина, и поэтому выражение всегда было истинным. Я потратил много времени на то, чтобы понять это.
Я не утверждаю, что это что-то добавляет к обсуждению. Я просто подумал, что это может быть слегка забавный анекдот.
Еще более кратко можно было бы использовать GetACP - вызов Win32 API для возврата кодовой страницы по умолчанию! (Кодовая страница по умолчанию часто называется "ANSI")
int nCodePage = GetACP();
Также многие вызовы API (например, MultiByteToWideChar
) принимают постоянное значение CP_ACP
(ноль), которое всегда означает " используйте системную кодовую страницу ". Таким образом, вам может и не понадобиться знать текущую кодовую страницу, в зависимости от того, что вы хотите с ней делать.
GetSystemDefaultLCID () дает вам системный языковой стандарт.
Если LCID недостаточно и вам действительно нужна кодовая страница, используйте этот код:
TCHAR szCodePage[10];
int cch= GetLocaleInfo(
GetSystemDefaultLCID(), // or any LCID you may be interested in
LOCALE_IDEFAULTANSICODEPAGE,
szCodePage,
countof(szCodePage));
nCodePage= cch>0 ? _ttoi(szCodePage) : 0;
У меня это сработало, спасибо, но можно записать более кратко:
UINT nCodePage = CP_ACP;
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,
LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE,
(LPTSTR)&nCodePage, sizeof(nCodePage) / sizeof(_TCHAR) );