_T 无法识别 - 将 tchar.h 从微软移植到 gcc

_T not recognized - porting tchar.h from microsoft to gcc

我正在尝试移植一个在 Microsoft Visual studio 上运行良好的组件 该组件中包含以下代码

if ( SuperNode.someMethod == _T( "Hello" ) )    

尝试在 gcc cygwin 中构建代码时出现以下错误

error: '_T' was not declared in this scope|

现在 visual studio _T 指向 tchar.h 里面有这样的东西

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)

我该怎么做才能解决 gcc cygwin 的这个问题?我会 运行 它在 windows

在 Visual Studio headers 中,如果使用宽字符支持进行编译,则 _T 定义为 L,否则什么也没有。

因此,如果启用宽字符支持,_T("blah blah blah") 将被预处理为 L"blah blah blah"

如果禁用宽字符支持,_T("blah blah blah") 将被预处理为 "blah blah blah"

正如在 tchar.h not found on cygwin 中讨论的那样,Cygwin(是一个兼容层,试图在 Windows 之上模拟 POSIX 编程接口)与 Unix 有更多共同点实施比它 Windows。特别是,它不提供 tchar.h.

你应该怎么做取决于你更大的目标:为什么你试图使用Visual Studio以外的东西来编译这个程序?这里有一些可能性:

  • 你想要一个比 VS2010 提供的更符合标准的 C++ 实现,但你仍然想要构建一个本机 Windows 应用程序。阻力最小的途径可能是改用 Visual Studio 的更新版本; "Express" 这些版本都是免费的。您也可以尝试 MinGW, which is a GCC backend that produces native Windows applications, and Clang for Windows.

  • 您需要在 ABI 级别与使用 MinGW 编译的 C++ 程序进行互操作(例如将 DLL 加载到其中)。在那种情况下,您还应该使用 MinGW。 (Clang-for-Windows 应该与 Visual Studio 兼容 ABI,因此在这种情况下它不起作用。请注意,如果所涉及的 ABI 完全以普通方式指定 C,那么将 Visual Studio 编译的 DLL 加载到 MinGW 编译的程序中应该没有问题,反之亦然。)

  • 这是 Unix 移植的第一阶段(注意:出于本次讨论的目的,MacOS X 算作 Unix),或者您需要在 ABI 级别与 Cygwin program ... 这意味着你必须移植到 Unix。在这种情况下,阶段 zero 需要 停止使用 tchar.h

    我的意思是,回到您的 Visual Studio 构建,然后找到代码中使用 tchar.h 中定义的任何内容的每个地方(_TCHAR_T_TEXT_tcs*,可能还有其他)并将它们更改为使用普通的 charwchar_t,视情况而定,以及相关的字符串文字语法和职能。您还应该同时摆脱核心 Windows API 的通用(既不是 A 也不是 W 后缀)变体。我相信您可以定义一个宏,它会导致 windows.h 根本不提供通用 API,但我不记得它是什么,现在无法在 MSDN 上找到它。

    在执行此操作时请记住,Unix 更喜欢您在 char/std::string 中使用 UTF-8 编码的文本,而不是在 wchar_t/[ 中使用 UTF-16 文本=25=] 等。根据我的经验,跨平台应用程序通常最符合 Unix 约定 除了 直接与 Windows API,专门使用 API 的 W 变体,当场来回转换。 (并且您需要为自己创建一个兼容层并将所有代码隔离在那里并安排尽可能少的代码。)