First go to an article Article :
I also encountered this problem when I was a beginner at windows SDK programming. I believe many beginners of Windows programming have also encountered this problem. Later, I gradually understood this problem, but sometimes I am not quite clear about it when asked by others. Today, I would like to take this opportunity to organize my own ideas and explain this question in detail in the following article, hoping to help my friends who have this question.
Unicode and _ Unicode are not "defined" in the header file,ProgramThis is defined by one of the following methods:
1. UseCodeAs defined above;
2. specified in the compilation options. For example, in VC:
Project-> Settings-> C/C ++-> category-> Preprocessor Definitions
Here is the pre-processing command. There are some other common constants such as Win32, _ debug, ndebug, and _ windows.
Therefore, you cannot find the definition in the header file (note that the definition is not used, and there are many places to use it ).
However, these two symbols have specific meanings for Windows programs. That is to say, you cannot define Unicode as Unicode, Unicode, useunicode... otherwise, they will be useless. Because in many header files, these two symbols are used to judge:
1. Use that encoding method, namely Unicode and single-byte;
2. Meanings of specific types in windows;
3. Select different character processing functions based on Unicode and single-byte encoding.
For example, in the case of _ Unicode, you can use tchar. h, which is used to parse whether the tchar type is wide character or single byte character, and whether the processing result of some string macros is wide character or single byte, for example:
# Ifdef _ Unicode
Typedef wchar_t tchar;
# Else
Typedef char tchar;
# Endif
Macro defined in a similar way:
_ Text ("Hello! "), _ T (" Hello! "), Text (" Hello! "), L (" Hello! ")
The macro above indicates that if it is Unicode, It is a wide character; otherwise, it is processed as a traditional single-byte ASCII character.
Unicode is used in many header files like _ Unicode to parse whether the tchar type is a wide character or a single byte character, such as winnt. h:
# Ifdef Unicode
Typedef wchar tchar, * ptchar;
Typedef lpwstr lptch, ptch, ptstr, lptstr;
Typedef maid;
# Else
Typedef char tchar, * ptchar;
Typedef lpstr lptch, ptch, ptstr, lptstr;
Typedef maid;
# Endif
It is also used to select character processing functions, such as in winuser. h:
# Ifdef Unicode
# Define MessageBox messageboxw
# Else
# Define MessageBox messageboxa
# Endif
In this case, we only use one type (such as tchar) and one group of functions (such as MessageBox) to easily process two encoding programs, instead of using conditions to determine whether Char or wchar_t should be used, messageboxa or messageboxw should be used. These details have already been taken into consideration in header files such as Windows. H. All we need to do is to define two symbols when Unicode is required.
On the other hand, windows. h # include and WinNT. h. winuser. H and many other header files are included, and there are also repeated crossover (of course, the Conditional compilation and filtering are used) in many places. Therefore, both symbols (Unicode and _ Unicode) must be defined, otherwise, it will be difficult to predict the result, as defined in the previous definition.
Conclusion: With these features, you can use macros (such as: _ T, lptstr, and lpctrstr with the t sign) to convert between ASCII and Unicode. The program is highly portable.