_tmain
existiert nicht in C ++. main
tut.
_tmain
ist eine Microsoft-Erweiterung.
main
ist nach dem C ++ - Standard der Einstiegspunkt des Programms. Es hat eine dieser beiden Signaturen:
int main();
int main(int argc, char* argv[]);
Microsoft hat ein wmain hinzugefügt, das die zweite Signatur durch Folgendes ersetzt:
int wmain(int argc, wchar_t* argv[]);
Um den Wechsel zwischen Unicode (UTF-16) und ihrem Multibyte-Zeichensatz zu vereinfachen, haben sie definiert, _tmain
welcher, wenn Unicode aktiviert ist, als wmain
und ansonsten als kompiliert wird main
.
Was den zweiten Teil Ihrer Frage betrifft, so ist der erste Teil des Puzzles, dass Ihre Hauptfunktion falsch ist. wmain
sollte ein wchar_t
Argument nehmen, nicht char
. Da der Compiler dies für die main
Funktion nicht erzwingt , erhalten Sie ein Programm, in dem ein Array von wchar_t
Zeichenfolgen an die main
Funktion übergeben wird, die sie als char
Zeichenfolgen interpretiert .
In UTF-16, dem Zeichensatz, der von Windows verwendet wird, wenn Unicode aktiviert ist, werden alle ASCII-Zeichen als Bytepaar \0
gefolgt vom ASCII-Wert dargestellt.
Und da die x86-CPU Little-Endian ist, wird die Reihenfolge dieser Bytes vertauscht, sodass der ASCII-Wert zuerst kommt, gefolgt von einem Null-Byte.
Und wie wird die Zeichenfolge in einer Zeichenfolge normalerweise beendet? Ja, um ein Null-Byte. Ihr Programm sieht also eine Reihe von Zeichenfolgen, die jeweils ein Byte lang sind.
Im Allgemeinen haben Sie bei der Windows-Programmierung drei Möglichkeiten:
- Verwenden Sie explizit Unicode (rufen Sie wmain auf und rufen Sie für jede Windows-API-Funktion, die char-bezogene Argumente
-W
akzeptiert, die Version der Funktion auf. Rufen Sie anstelle von CreateWindow CreateWindowW auf). Und anstatt Verwendung zu char
verwenden wchar_t
, und so weiter
- Deaktivieren Sie Unicode explizit. Rufen Sie main und CreateWindowA auf und verwenden Sie sie
char
für Zeichenfolgen.
- Erlaube beides. (Rufen Sie _tmain und CreateWindow auf, die in main / _tmain und CreateWindowA / CreateWindowW aufgelöst werden.) Verwenden Sie TCHAR anstelle von char / wchar_t.
Gleiches gilt für die von windows.h definierten Zeichenfolgentypen: LPCTSTR wird entweder in LPCSTR oder LPCWSTR aufgelöst, und für jeden anderen Typ, der char oder wchar_t enthält, ist immer eine -T-Version vorhanden, die stattdessen verwendet werden kann.
Beachten Sie, dass dies alles Microsoft-spezifisch ist. TCHAR ist kein Standard-C ++ - Typ, sondern ein in windows.h definiertes Makro. wmain und _tmain werden ebenfalls nur von Microsoft definiert.