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

时间:2015-01-28 19:21:23

标签: c++ visual-studio-2010 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上运行它

2 个答案:

答案 0 :(得分:6)

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

您应该做些什么取决于您的更大目标:为什么您是否尝试使用Visual Studio以外的其他程序编译此程序?以下是一些可能性:

  • 您希望获得比VS2010更符合标准的C ++实现,但您仍然希望构建本​​机Windows应用程序。阻力最小的路径可能是转而使用较新版本的Visual Studio; "快递"这些版本都是免费的啤酒。您还可以尝试MinGW,这是一个生成原生 Windows应用程序的GCC后端,以及Clang for Windows

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

  • 这是Unix端口的第一阶段(注意:为了讨论的目的,MacOS X算作Unix),或者你需要在ABI级别与 Cygwin 进行互操作程序...这意味着你必须移植到Unix。在这种情况下,阶段需要停止使用tchar.h

    我的意思是,返回到您的Visual Studio版本,然后找到代码中使用tchar.h_TCHAR_T,{_TEXT中定义的任何内容的每个位置{1}},_tcs*,可能是其他人)并根据需要将其更改为使用普通charwchar_t以及相关的字符串文字语法和函数。您还应该同时摆脱核心Windows API的通用(AW后缀)变体。我相信您可以定义一个宏,导致windows.h根本不提供通用API,但我不记得它是什么,现在无法在MSDN上找到它。< / p>

    请注意,在执行此操作时,Unix会优先使用char / std::string中的UTF-8编码文本,而不是wchar_t / {{1中的UTF-16文本根据我的经验,跨平台应用程序通常最符合Unix惯例,除了直接与Windows API相关的函数,它们只使用{{1}该API的变体,然后在那里来回转换。 (并且您需要创建一个兼容性层并在那里隔离所有代码并安排尽可能少的代码。)

答案 1 :(得分:3)

在Visual Studio标头中,如果使用广泛的字符支持进行编译,则_T被定义为L,或者没有其他任何内容。

因此,如果启用了广泛的字符支持,_T("blah blah blah")将被预处理到L"blah blah blah"

如果禁用广泛字符支持,_T("blah blah blah")将被预处理到"blah blah blah"