﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-zoel175185</title><link>http://www.cppblog.com/zoel175185/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 18:55:22 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 18:55:22 GMT</pubDate><ttl>60</ttl><item><title>size_t,__T,_T,TEXT,_TEXT等一些特殊宏的理解</title><link>http://www.cppblog.com/zoel175185/archive/2010/11/13/133522.html</link><dc:creator>loma</dc:creator><author>loma</author><pubDate>Sat, 13 Nov 2010 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/zoel175185/archive/2010/11/13/133522.html</guid><wfw:comment>http://www.cppblog.com/zoel175185/comments/133522.html</wfw:comment><comments>http://www.cppblog.com/zoel175185/archive/2010/11/13/133522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zoel175185/comments/commentRss/133522.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zoel175185/services/trackbacks/133522.html</trackback:ping><description><![CDATA[<p><span>typedef char TCHAR ; &nbsp;&nbsp; <br></span><span>现在开始讨论字符串文字中的</span><span>L</span><span>问题。如果定义了</span><span>_UNICODE</span><span>标识符，那么一个称作</span><span>__T</span><span>的宏就定义如下：</span><span><br><br>#define __T(x) L##x &nbsp;&nbsp; <br></span><span>这是相当晦涩的语法，但合乎</span><span>ANSI C</span><span>标准的前置处理器规范。那一对井字号称为「粘贴符号（</span><span>token paste</span><span>）」，它将字母</span><span>L</span><span>添加到宏参数上。因此，如果宏参数是</span><span>"Hello!"</span><span>，则</span><span>L##x</span><span>就是</span><span>L"Hello!"</span><span>。</span><span><br><br></span><span>如果没有定义</span><span>_UNICODE</span><span>标识符，则</span><span>__T</span><span>宏只简单地定义如下：</span><span><br><br>#define __T(x) x &nbsp;&nbsp; <br></span><span>此外，还有两个宏与</span><span>__T</span><span>定义相同：</span><span><br><br>#define _T</span><span>（</span><span>x</span><span>）</span><span>__T</span><span>（</span><span>x</span><span>）</span><span> &nbsp;&nbsp; <br>#define _TEXT</span><span>（</span><span>x</span><span>）</span><span>__T</span><span>（</span><span>x</span><span>）</span><span> &nbsp;&nbsp; <br></span><span>在</span><span>Win32 console</span><span>程序中使用哪个宏，取决于您喜欢简洁还是详细。基本地，必须按下述方法在</span><span>_T</span><span>或</span><span>_TEXT</span><span>宏内定义字符串文字：</span><span><br><br>_TEXT ("Hello!") &nbsp;&nbsp; <br></span><span>这样做的话，如果定义了</span><span>_UNICODE</span><span>，那么该串将解释为宽字符的组合，否则解释为</span><span>8</span><span>位的字符字符串。</span><span><br><br></span><span>宽字符和</span><span> Windows<br><br><br>Windows NT</span><span>从底层支援</span><span>Unicode</span><span>。这意味着</span><span>Windows NT</span><span>内部使用由</span><span>16</span><span>位字符组成的字符串。因为世界上其它许多地方还不使用</span><span>16</span><span>位字符串，所以</span><span>Windows NT</span><span>必须经常将字符串在操作系统内转换。</span><span>Windows NT</span><span>可执行为</span><span>ASCII</span><span>、</span><span>Unicode</span><span>或者</span><span>ASCII</span><span>和</span><span>Unicode</span><span>混合编写的程序。即，</span><span>Windows NT</span><span>支持不同的</span><span>API</span><span>函数呼叫，这些函数接受</span><span>8</span><span>位或</span><span>16</span><span>位的字符串（我们将马上看到这是如何动作的。）</span><span><br><br></span><span>相对于</span><span>Windows NT</span><span>，</span><span>Windows 98</span><span>对</span><span>Unicode</span><span>的支持要少得多。只有很少的</span><span>Windows 98</span><span>函数呼叫支持宽字符串（这些函数列在《</span><span>Microsoft Knowledge Base article Q125671</span><span>》中；它们包括</span><span>MessageBox</span><span>）。如果要发行的程序中只有一个</span><span>.EXE</span><span>文件要求在</span><span>Windows NT</span><span>和</span><span>Windows 98</span><span>下都能执行，那么就不应该使用</span><span>Unicode</span><span>，否则就不能在</span><span>Windows 98</span><span>下执行；尤其程序不能呼叫</span><span>Unicode</span><span>版的</span><span>Windows</span><span>函数。这样，将来发行</span><span>Unicode</span><span>版的程序时会处于更有利的位置，您应试着编写既为</span><span> ASCII</span><span>又为</span><span>Unicode</span><span>编译的原始码。这就是本书中所有程序的编写方式。</span><span><br><br>Windows</span><span>表头文件类型</span><span><br><br><br></span><span>正如您在第一章所看到的那样，一个</span><span>Windows</span><span>程序包括表头文件</span><span>WINDOWS.H</span><span>。该文件包括许多其它表头文件，包括</span><span> WINDEF.H</span><span>，该文件中有许多在</span><span>Windows</span><span>中使用的基本型态定义，而且它本身也包括</span><span>WINNT.H</span><span>。</span><span>WINNT.H</span><span>处理基本的</span><span>Unicode</span><span>支</span> <span>持。</span><span><br><br>WINNT.H</span><span>的前面包含</span><span>C</span><span>的表头文件</span><span>CTYPE.H</span><span>，这是</span><span>C</span><span>的众多表头文件之一，包括</span><span>wchar_t</span><span>的定义。</span><span>WINNT.H</span><span>定义了新的数据型态，称作</span><span>CHAR</span><span>和</span><span>WCHAR</span><span>：</span><span><br><br>typedef char CHAR ; &nbsp;&nbsp; <br>typedef wchar_t WCHAR ; // wc &nbsp;&nbsp; <br></span><span>当您需要定义</span><span>8</span><span>位字符或者</span><span>16</span><span>位字符时，推荐您在</span><span>Windows</span><span>程序中使用的数据型态是</span><span>CHAR</span><span>和</span><span>WCHAR</span><span>。</span><span>WCHAR</span><span>定义后面的注释是匈牙利标记法的建议：一个基于</span><span>WCHAR</span><span>数据型态的变量可在前面附加上字母</span><span>wc</span><span>以说明一个宽字符。</span><span><br><br>WINNT.H</span><span>表头文件进而定义了可用做</span><span>8</span><span>位字符串指针的六种数据型态和四个可用做</span><span>const 8</span><span>位字符串指针的数据型态。这里精选了表头文件中一些实用的说明数据型态语句：</span><span><br><br>typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ; &nbsp;&nbsp; <br>typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ; &nbsp;&nbsp; <br></span><span>前缀</span><span>N</span><span>和</span><span>L</span><span>表示「</span><span>near</span><span>」和「</span><span>long</span><span>」，指的是</span><span>16</span><span>位</span><span>Windows</span><span>中两种大小不同的指标。在</span><span>Win32</span><span>中</span><span>near</span><span>和</span><span>long</span><span>指标没有区别。</span><span><br><br></span><span>类似地，</span><span>WINNT.H</span><span>定义了六种可作为</span><span>16</span><span>位字符串指针的数据型态和四种可作为</span><span>const 16</span><span>位字符串指针的数据型态：</span><span><br><br>typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ; &nbsp;&nbsp; <br>typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ; &nbsp;&nbsp; <br></span><span>至此，我们有了数据型态</span><span>CHAR</span><span>（一个</span><span>8</span><span>位的</span><span>char</span><span>）和</span><span>WCHAR</span><span>（一个</span><span>16</span><span>位的</span><span>wchar_t</span><span>），以及指向</span><span>CHAR</span><span>和</span><span>WCHAR</span><span>的指标。与</span><span> TCHAR.H</span><span>一样，</span><span>WINNT.H</span><span>将</span><span>TCHAR</span><span>定义为一般的字符类型。如果定义了标识符</span><span>UNICODE</span><span>（没有底线），则</span><span>TCHAR</span><span>和指向</span><span>TCHAR</span><span>的指</span> <span>标就分别定义为</span><span>WCHAR</span><span>和指向</span><span>WCHAR</span><span>的指标；如果没有定义标识符</span><span>UNICODE</span><span>，则</span><span>TCHAR</span><span>和指向</span><span>TCHAR</span><span>的指标就分别定义为</span><span>char</span><span>和指向</span><span> char</span><span>的指标：</span><span><br><br>#ifdef&nbsp;&nbsp; UNICODE<br>typedef WCHAR TCHAR, * PTCHAR ;<br>typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;<br>typedef LPCWSTR LPCTSTR ; &nbsp;&nbsp;&nbsp;<br>#else<br>typedef char TCHAR, * PTCHAR ; <br>typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;<br>typedef LPCSTR LPCTSTR ;&nbsp;&nbsp;<br>#endif<br>&nbsp;&nbsp; <br></span><span>如果已经在某个表头文件或者其它表头文件中定义了</span><span>TCHAR</span><span>数据型态，那么</span><span>WINNT.H</span><span>和</span><span>WCHAR.H</span><span>表头文件都能防止其重复定义。不过，无论何时在程序中使用其它表头文件时，都应在所有其它表头文件之前包含</span><span>WINDOWS.H</span><span>。</span><span><br><br>WINNT.H</span><span>表头文件还定义了一个宏，该宏将</span><span>L</span><span>添加到字符串的第一个引号前。如果定义了</span><span>UNICODE</span><span>标识符，则一个称作</span><span> __TEXT</span><span>的宏定义如下：</span><span><br><br>#define __TEXT(quote) L##quote &nbsp;&nbsp; <br></span><span>如果没有定义标识符</span><span>UNICODE</span><span>，则像这样定义</span><span>__TEXT</span><span>宏：</span><span><br><br>#define __TEXT(quote) quote &nbsp;&nbsp; <br></span><span>此外，</span><span> TEXT</span><span>宏可这样定义：</span><span><br><br>#define TEXT(quote) __TEXT(quote) &nbsp;&nbsp; <br></span><span>这与</span><span>TCHAR.H</span><span>中定义</span><span>_TEXT</span><span>宏的方法一样，只是不必操心底线。我将在本书中使用这个宏的</span><span>TEXT</span><span>版本。</span><span><br><br></span><span>这些定义可使您在同一程序中混合使用</span><span>ASCII</span><span>和</span><span>Unicode</span><span>字符串，或者编写一个可被</span><span>ASCII</span><span>或</span><span>Unicode</span><span>编译的程序。如果您希望明确定义</span><span>8</span><span>位</span> <span>字符变量和字符串，请使用</span><span>CHAR</span><span>、</span><span>PCHAR</span><span>（或者其它），以及带引号的字符串。为明确地使用</span><span>16</span><span>位字符变量和字符串，请使用</span><span>WCHAR</span><span>、</span><span> PWCHAR</span><span>，并将</span><span>L</span><span>添加到引号前面。对于是</span><span>8</span><span>位还是</span><span>16</span><span>位取决于</span><span>UNICODE</span><span>标识符的定义的变量或字符串，要使用</span><span>TCHAR</span><span>、</span><span>PTCHAR</span><span>和</span><span>TEXT </span><span>宏。</span></p>
<img src ="http://www.cppblog.com/zoel175185/aggbug/133522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zoel175185/" target="_blank">loma</a> 2010-11-13 13:41 <a href="http://www.cppblog.com/zoel175185/archive/2010/11/13/133522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>