1

我的项目有两个 cpp 文件和一个头文件。一个 cpp 文件包含一个类的实现,它的声明在头文件中。另一个 cpp 文件包含该int main函数。

该类的构造函数之一包括一个参数,它在链接器错误TCHAR中被引用为未解析的函数。LNK2019

我正在使用 Visual Studio 2010,并且我已将Character set项目属性中的选项设置为,Not Set以便我可以在charwchar_t使用宏UNICODE之间进行选择。_UNICODE

目前我已经在我的主 cpp 文件的开头定义了这些,并且头文件包含在这两个之后。但是,如果我在头文件的开头定义这些宏,则项目可以完美编译。

有没有办法解决这个问题?还是我必须对类进行硬编码才能使用charor wchar_t

谢谢。

4

2 回答 2

3

您收到链接器错误,因为您在 main.cpp 中定义UNICODE/_UNICODE 宏,但不在类的实现 .cpp 中。因此,当 main.cpp 包含您的类的头文件时,它会显示TCHARwchar_t,但是当您的实现 .cpp 包含您的头文件时,它会显示TCHARchar。您的不匹配导致链接器错误,因为 main.cpp 调用了wchar_t您尚未实际实现的构造函数。

您应该寻找UNICODE/_UNICODE宏的存在,而不是手动定义它们。将“字符集”选项设置为 MBCS 或 Unicode,以便 IDE/编译器可以为您全局管理整个项目的宏。我不知道将其设置为“未设置”实际上做了什么,但这不是您在这种情况下真正需要的。

于 2012-09-16T15:48:32.697 回答
1

宏是显然让您感到困惑的预处理器结构。你的代码,即使你成功了,也会让其他人感到困惑。宏UNICODE_UNICODE必须在定义之前TCHAR定义,在TCHAR使用之前定义它们为时已晚。最好将其留给您的项目设置。

将项目设置Character SetUnicode,即 Windows 内部使用的字符集。然后TCHAR就是wchar_tAPI 调用宏Something()总是扩展为SomethingW(). 您可以在任何地方显式地使用charwchar_t,代码的读者将确切地看到什么是什么,TCHAR对他们来说没有模糊和不清楚。

Windows API 函数SomethingA()只是包装器,SomethingW()因此大量使用 A 版本效率低下。如果您需要调用 API 函数SomethingA(),请明确执行,这样每个人都会看到您必须做一些低效的事情。

于 2012-09-16T11:51:59.207 回答