To compile Unicode applications, define _UNICODE and UNICODE in your files when compiling and add -municode when linking. GCC will use the appropriate C startups for linking.
#include <wchar.h>
#include <stdio.h>
int
wmain (int argc, wchar_t **argv)
{
wprintf(L"Hello\n");
return 0;
}
While it is not necessary to define _UNICODE or UNICODE to compile the above code, -municode is needed for linking because it uses wmain() instead of the traditional main().
#define _UNICODE
#define UNICODE
#include <tchar.h>
int
_tmain(int argc, _TCHAR **argv)
{
_tprintf(__T("Hello\n"));
return 0;
}
The above code makes use of tchar.h mapping, which allows it to both compile in Unicode and non-Unicode mode. Removing the 2 defines on top will revert it to the traditional ANSI output. The -municode option is still required when linking if Unicode mode is used.
The UNICODE symbol is used primarily with win32 API such as those found in mmsystem.h and shellapi.h. The _UNICODE symbol is used with headers such as tchar.h to direct standard C functions such as printf() and fopen() to the Unicode versions. The -municode defines UNICODE, but not _UNICODE, it is safer to use a macro such as bellow to ensure that Unicode functions are used instead of their ANSI counterparts.
#ifndef UNICODE
#undef _UNICODE
#else
#ifndef _UNICODE
#define _UNICODE
#endif
#endif
g++ doesn't know a thing about wmain(), therefore, marking wmain() explicitly as extern "C" is necessary in C++ code, otherwise linkage fails with a cryptic message of undefined reference to wWinMain. Example:
#ifndef _UNICODE
#define _UNICODE
#endif
#ifndef UNICODE
#define UNICODE
#endif
#include <wchar.h>
#include <stdio.h>
extern "C"
int wmain(int argc, wchar_t** argv)
{
[... code ...]
}
Make sure you are using GCC with the vendor key "w64". To check, use "gcc -dumpmachine". If it reads x86_64-w64-mingw32, you are probably using an old version of gcc that does not support this feature. If it reads x86_64-pc-mingw32, you will need to rebuild your toolchain with the "w64" vendor key to enable the Unicode feature.