-
Ansi/unicode
If I want my application's character set to be neutral (as opposed
to strictly ANSI or UNICODE), I'm aware of the declaration of
TCHARs instead of CHARs and using functions such as _tcscat
instead of strcat, what else would I have to do for the
preprocessor exactly to be able to switch between an ANSI
and a UNICODE build?
Thanks
-
Somewhere in the compiler options (Project Settings->Preprocessor in VC++) you need to remove MBCS and put UNICODE and _UNICODE (both of them, note the second has the preceding underscore).
Here's some little bits of code that might be useful if you use the STL under Windows at all...
Code:
#ifdef UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif
string WideToANSI(wstring sIn) {
int iReq = WideCharToMultiByte(CP_ACP, 0, sIn.c_str(), -1, NULL, 0, NULL, NULL);
char *pcBuf = new char[iReq];
WideCharToMultiByte(CP_ACP, 0, sIn.c_str(), -1, pcBuf, iReq, NULL, NULL);
string sTemp = pcBuf;
delete[] pcBuf;
return sTemp;
}
wstring ANSIToWide(string sIn) {
int iReq = MultiByteToWideChar(CP_ACP, 0, sIn.c_str(), -1, NULL, 0);
wchar_t *pcBuf = new wchar_t[iReq];
MultiByteToWideChar(CP_ACP, 0, sIn.c_str(), -1, pcBuf, iReq);
wstring sTemp = pcBuf;
delete[] pcBuf;
return sTemp;
}
tstring EnsureTStr(string sIn) {
#ifndef UNICODE
return sIn;
#else
return ANSIToWide(sIn);
#endif
}
tstring EnsureTStr(wstring sIn) {
#ifdef UNICODE
return sIn;
#else
return WideToANSI(sIn);
#endif
}
-
-
And if you are too lazy to set both UNICODE and _UNICODE:
Code:
#ifdef UNICODE
#ifndef _UNICODE
#define _UNICODE
#endif
#endif
#ifdef _UNICODE
#ifndef UNICODE
#define UNICODE
#endif
#endif
Write that before you inclue ANY headers.
Also make sure that you use _tmain/_tWinMain. To make such apps working you should also write this:
#ifdef UNICODE
// this if you are writing a console app
#pragma comment(linker, "/entry:\"wmainCRTStartup\"")
// this if you are writing a GUI app
#pragma comment(linker, "/entry:\"wWinMainCRTStartup\"")
#else
// this if you are writing a console app
#pragma comment(linker, "/entry:\"mainCRTStartup\"")
// this if you are writing a GUI app
#pragma comment(linker, "/entry:\"WinMainCRTStartup\"")
#endif