_tmainnon esiste in C ++. mainlo 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 _tmainquali, 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. wmaindovrebbe prendere una wchar_tdiscussione, no char. Poiché il compilatore non applica questo per la mainfunzione, si ottiene un programma in cui un array di wchar_tstringhe viene passato alla mainfunzione, che le interpreta come charstringhe.
Ora, in UTF-16, il set di caratteri utilizzato da Windows quando Unicode è abilitato, tutti i caratteri ASCII sono rappresentati come coppia di byte \0seguita 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
-Wversione della funzione. Invece di CreateWindow, chiama CreateWindowW). E invece di usare charusewchar_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.