_tmain
existiert nicht in C++. main
tut.
_tmain
ist eine Microsoft-Erweiterung.
main
ist nach dem C++ - Standard der Einstiegspunkt des Programms. Es ist einer dieser beiden Unterschriften hat:
int main();
int main(int argc, char* argv[]);
Microsoft eine wmain hinzugefügt, die die zweite Signatur mit dieser ersetzt:
int wmain(int argc, wchar_t* argv[]);
Und dann, um es einfacher zwischen Unicode zu wechseln (UTF- 16) und ihre Multibyte-Zeichensatz, haben sie _tmain
definiert, die, wenn Unicode aktiviert ist, als wmain
kompiliert wird und ansonsten als main
.
Wie im zweiten Teil Ihrer Frage, der erste Teil des Puzzles ist, 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
-Strings 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 das Bytepaar \0
dargestellt, gefolgt vom ASCII-Wert.
Und da die x86-CPU Little-Endian ist, wird die Reihenfolge dieser Bytes vertauscht, so dass der ASCII-Wert zuerst kommt, gefolgt von einem Null-Byte.
Und in einer Zeichenkette, wie ist die Zeichenfolge in der Regel beendet? Ja, durch ein Nullbyte. Ihr Programm sieht also eine Reihe von Strings, die jeweils ein Byte lang sind.
In der Regel haben Sie drei Möglichkeiten, wenn die Windows-Programmierung zu tun:
- Explizit Unicode (Call- wmain, und für jede Windows-API-Funktion, die char bezogene Argumente, rufen Sie die
-W
Version der Funktion übernimmt.Rufen Sie CreateWindowW (statt CreateWindow) auf. Und statt char
verwenden Sie wchar_t
, und so weiter
- Explizit deaktivieren Sie Unicode. Rufen Sie main und CreateWindowA auf und verwenden Sie
char
für Strings.
- Erlauben beide. (Rufen Sie _tmain und CreateWindow auf, die zu main/_tmain und CreateWindowA/CreateWindowW aufgelöst werden), und verwenden Sie TCHAR anstelle von char/wchar_t.
Das gleiche gilt für die Abkürzungen von windows.h definiert: LPCTSTR löst entweder LPCSTR oder LPCWSTR, und für jeden anderen Typ, der char oder wchar_t enthält, eine -T- Version existiert immer, welche verwendet werden können, stattdessen.
Beachten Sie, dass dies alles Microsoft-spezifisch ist. TCHAR ist kein Standard-C++ - Typ, es ist ein Makro, das in windows.h definiert ist. wmain und _tmain werden ebenfalls nur von Microsoft definiert.
ich frage mich, ob sie auch ein tcout bieten? damit man einfach << argv [n] tun könnte; und es löst in Ansi und WCout im Unicode-Modus zu cout? Ich vermute, dass das für ihn in dieser Situation nützlich sein könnte. und +1 natürlich, nette Antwort :) –
Welchen Nachteil würde UNICODE deaktivieren? – joshcomley
@Johannes Schaub - littb: AFAIK, sie bieten kein tcout (auch wenn sie cout und wcout anbieten). In Visual C++ 2003 musste ich einen definieren und alle anderen STL-bezogenen Symbole definieren und/oder schreiben, die ich mit TCHAR verwenden wollte. Ich weiß jedoch nicht auf Visual C++ 2008 oder 2010. – paercebal