为什么在win32中对于同一个东西有不同的TEXT像宏?

sg1*_*sg1 4 c++ windows winapi

我想知道为什么有这些宏的原因,如T,TEXT,_TEXT,__TEXT或__T,当它们最终都做同样的事情.

如果定义了UNICODE,则将"string"映射到L"string".

谢谢你的回答.在一个更实际的方法,有人可以解释下面给出的代码的行为?

#include <stdio.h>
#include <conio.h>
#include <tchar.h>   // For _T and _TEXT
#include <windows.h> // For __TEXT 

int __cdecl main ()

{

  printf ("%s", _TEXT(__FILE__ ));  // Works fine

  printf ("%s", _T(__FILE__));      // Works fine

  printf ("%s", __TEXT(__FILE__ )); // error C2065: 'L__FILE__': undeclared identifier

  _getwch();

}
Run Code Online (Sandbox Code Playgroud)

更新:我认为我的代码与C预处理器标记化有关.我正在发布一个单独的问题.谢谢.

Chr*_*n.K 13

由于"神秘"的事情经常发生,雷蒙德陈提供了一些信息(重点补充):

那么所有这些不同的说法方式是什么呢?实际上有一种疯狂背后的方法.

没有下划线的普通版本会影响Windows头文件视为默认的字符集.因此,如果您定义UNICODE,那么GetWindowText将映射到GetWindowTextW而不是GetWindowTextA.类似地,TEXT宏将映射到L"..."而不是"...".

带有下划线的版本会影响C运行时头文件视为默认值的字符集.因此,如果您定义_UNICODE,那么_tcslen将映射到wcslen而不是strlen,例如.同样,_TEXT宏将映射到L"..."而不是"..."._T怎么样?好的,我不知道那一个.也许只是为了节省一些打字的人.

  • @KerrekSB:使用类似TEXT的宏的技巧是它们需要分两步完成:你不能只做`#define TEXT(str)L ## str` - 因为这不适用于`__FILE__`或其他字符串宏 - 你只需得到'L__FILE__` - 这就是OP所看到的.相反,你必须使用辅助宏分两步完成 - 而`__TEXT`就是帮助器.最终得到:`#define TEXT(str)__TEXT(str)` - 和 - #define __TEXT(str)L ## str`.现在,在使用`__TEXT`时,`__FILE__`已经扩展为一个字符串,因此L得到了正确的前置.(有关详细信息,请在winnt.h中搜索TEXT.) (3认同)

Adr*_*thy 5

对于许多宏,有 Win32 宏和 C 运行时库的宏。这将解释 TEXT (Win32) 和 _TEXT (C 运行时库)。双下划线版本可能是不用于一般用途的辅助宏。对于那些认为 TEXT 太长的人来说,T 可能是一种方便。