_tmain
non esiste in C ++. main
lo fa.
_tmain
è un'estensione di Microsoft.
main
è, secondo lo standard C ++, il punto di ingresso del programma. Ha una di queste due firme:
int main();
int main(int argc, char* argv[]);
Microsoft ha aggiunto un wmain che sostituisce la seconda firma con questa:
int wmain(int argc, wchar_t* argv[]);
E quindi, per rendere più semplice il passaggio tra Unicode (UTF-16) e il loro set di caratteri multibyte, hanno definito _tmain
quali, se Unicode è abilitato, è compilato come wmain
, e altrimenti comemain
.
Per quanto riguarda la seconda parte della tua domanda, la prima parte del puzzle è che la tua funzione principale è sbagliata. wmain
dovrebbe prendere una wchar_t
discussione, no char
. Poiché il compilatore non applica questo per la main
funzione, si ottiene un programma in cui un array di wchar_t
stringhe viene passato alla main
funzione, che le interpreta come char
stringhe.
Ora, in UTF-16, il set di caratteri utilizzato da Windows quando Unicode è abilitato, tutti i caratteri ASCII sono rappresentati come coppia di byte \0
seguita dal valore ASCII.
E poiché la CPU x86 è little-endian, l'ordine di questi byte viene scambiato, in modo che il valore ASCII venga prima, quindi seguito da un byte nullo.
E in una stringa di caratteri, come viene normalmente terminata la stringa? Sì, con un byte nullo. Quindi il tuo programma vede un mucchio di stringhe, ognuna lunga un byte.
In generale, hai tre opzioni quando esegui la programmazione di Windows:
- Usa esplicitamente Unicode (chiama wmain, e per ogni funzione API di Windows che accetta argomenti relativi al char, chiama la
-W
versione della funzione. Invece di CreateWindow, chiama CreateWindowW). E invece di usare char
usewchar_t
, e così via
- Disabilita esplicitamente Unicode. Chiamare main e CreateWindowA e utilizzare
char
per le stringhe.
- Consenti entrambi. (chiama _tmain e CreateWindow, che si risolvono in main / _tmain e CreateWindowA / CreateWindowW) e usa TCHAR invece di char / wchar_t.
Lo stesso vale per i tipi di stringa definiti da windows.h: LPCTSTR si risolve in LPCSTR o LPCWSTR e per ogni altro tipo che include char o wchar_t, esiste sempre una versione -T che può essere invece utilizzata.
Si noti che tutto ciò è specifico di Microsoft. TCHAR non è un tipo C ++ standard, è una macro definita in windows.h. Anche wmain e _tmain sono definiti solo da Microsoft.