_tmainexistiert nicht in C ++. maintut.
_tmain ist eine Microsoft-Erweiterung.
mainist 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, _tmainwelcher, wenn Unicode aktiviert ist, als wmainund ansonsten als kompiliert wird main.
Was den zweiten Teil Ihrer Frage betrifft, so ist der erste Teil des Puzzles, dass Ihre Hauptfunktion falsch ist. wmainsollte ein wchar_tArgument nehmen, nicht char. Da der Compiler dies für die mainFunktion nicht erzwingt , erhalten Sie ein Programm, in dem ein Array von wchar_tZeichenfolgen an die mainFunktion übergeben wird, die sie als charZeichenfolgen interpretiert .
In UTF-16, dem Zeichensatz, der von Windows verwendet wird, wenn Unicode aktiviert ist, werden alle ASCII-Zeichen als Bytepaar \0gefolgt 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
-Wakzeptiert, die Version der Funktion auf. Rufen Sie anstelle von CreateWindow CreateWindowW auf). Und anstatt Verwendung zu charverwenden wchar_t, und so weiter
- Deaktivieren Sie Unicode explizit. Rufen Sie main und CreateWindowA auf und verwenden Sie sie
charfü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.