我的项目有两个cpp文件和一个头文件。一个cpp文件包含单个类的实现,其声明在头文件中。另一个cpp文件包含int main
函数。
该类的一个构造函数包含TCHAR
参数,它被引用为LNK2019
链接器错误中未解析的函数。
我正在使用visual studio 2010,我已将项目属性中的Character set
选项设置为Not Set
,以便我可以char
和wchar_t
之间选择{ {1}}和UNICODE
宏。
目前我已在主cpp文件的开头定义了这些文件,并且在这两个文件之后包含了头文件。但是,如果我在头文件的开头定义这些宏,则项目编译完美。
有没有解决这个问题?或者我是否必须对该类进行硬编码才能使用_UNICODE
或char
?
感谢。
答案 0 :(得分:3)
您收到链接器错误,因为您在main.cpp中定义了UNICODE
/ _UNICODE
宏,但在类的实现.cpp中没有。因此,当main.cpp包含您的类的头文件时,它会将TCHAR
视为wchar_t
,但当您的实现.cpp包含您的头文件时,它会将TCHAR
视为char
而是。您有一个不匹配导致链接器错误,因为main.cpp调用您尚未实际实现的wchar_t
构造函数。
您应该查找UNICODE
/ _UNICODE
宏的存在,而不是实际手动定义它们。将“字符集”选项设置为MBCS或Unicode,以便IDE /编译器可以为整个项目全局管理宏。我不知道将它设置为“未设置”实际上是什么,但它不是你在这种情况下实际需要的。
答案 1 :(得分:1)
宏是预处理器构造,显然让您感到困惑。你的代码,即使你成功也会让别人感到困惑。必须在UNICODE
定义之前定义宏_UNICODE
和TCHAR
,在使用TCHAR
之前定义它们为时已晚。最好将它留给你的项目设置。
将项目的Character Set
设置为Unicode
,这是Windows内部使用的字符集。然后,TCHAR
为wchar_t
,API调用宏Something()
始终扩展为SomethingW()
。您可以在任何地方明确使用char
和wchar_t
,代码的读者将准确地看到它们是什么,没有暗淡和不清楚TCHAR
。
Windows API函数SomethingA()
只是SomethingW()
的包装器,因此使用A版本的效率很低。如果您需要调用API函数SomethingA()
,那么请明确地执行它,这样每个人都会发现您必须做一些效率低下的事情。