Мой проект имеет два файла cpp и один заголовочный файл. Один файл cpp содержит реализацию одного класса, и его объявление находится в заголовочном файле. Другой файл cpp, который содержит int main
функция.
Один из конструкторов класса включает в себя TCHAR
параметр, и он упоминается как неразрешенная функция в LNK2019
ошибка компоновщика.
Я использую Visual Studio 2010, и я установил Character set
опция в свойствах проекта Not Set
так что я могу выбирать между char
а также wchar_t
с помощью UNICODE
а также _UNICODE
макросы.
В настоящее время я определил их в начале моего основного файла cpp, а файлы заголовков включены после этих двух. Однако, если я определю эти макросы в начале заголовочного файла, проект скомпилируется отлично.
Есть ли способ решить эту проблему? Или я должен жестко закодировать класс, чтобы использовать либо char
или же wchar_t
?
Благодарю.
Вы получаете ошибку компоновщика, потому что вы определяете UNICODE
/_UNICODE
макросы внутри main.cpp, но не в реализации вашего класса .cpp. Таким образом, когда main.cpp включает заголовочный файл вашего класса, он видит TCHAR
как wchar_t
, но когда ваша реализация .cpp включает ваш заголовочный файл, он видит TCHAR
как char
вместо. У вас есть несоответствие, которое вызывает ошибку компоновщика, потому что main.cpp вызывает wchar_t
конструктор, который вы на самом деле не реализовали.
Вы должны искать наличие UNICODE
/_UNICODE
макросы, а не определять их вручную. Установите опцию «Набор символов» на MBCS или Unicode, чтобы IDE / компилятор мог управлять макросами глобально для всего проекта в целом для вас. Я не знаю, что на самом деле делает установка «Не установлено», но это не то, что вам действительно нужно в этой ситуации.
Макросы — это препроцессорные конструкции, которые, очевидно, сбивают вас с толку. Ваш код, даже если вы добьетесь успеха, будет сбивать с толку и других. Макросы UNICODE
а также _UNICODE
должны быть определены до TCHAR
определяется, определяя их раньше TCHAR
используется слишком поздно. Лучше оставить это в настройках вашего проекта.
Установить проект Character Set
в Unicode
это набор символов, который Windows использует внутри себя в любом случае. Тогда что TCHAR
является wchar_t
и макросы вызова API Something()
всегда расширяться до SomethingW()
, Ты можешь использовать char
а также wchar_t
явно везде и читатели кода точно увидят что к чему, без смутного и неясного TCHAR
для них.
Функции Windows API SomethingA()
просто фантики вокруг SomethingW()
поэтому использование версий А неэффективно. Если вам когда-либо понадобится вызвать функцию API SomethingA()
, затем сделайте это явно, чтобы все видели, что вы должны были сделать что-то неэффективное.