winapi — ошибка TCHAR и неразрешенного внешнего символа (LNK2019) в программе на C ++?

Мой проект имеет два файла cpp и один заголовочный файл. Один файл cpp содержит реализацию одного класса, и его объявление находится в заголовочном файле. Другой файл cpp, который содержит int main функция.

Один из конструкторов класса включает в себя TCHAR параметр, и он упоминается как неразрешенная функция в LNK2019 ошибка компоновщика.

Я использую Visual Studio 2010, и я установил Character set опция в свойствах проекта Not Set так что я могу выбирать между char а также wchar_t с помощью UNICODE а также _UNICODE макросы.

В настоящее время я определил их в начале моего основного файла cpp, а файлы заголовков включены после этих двух. Однако, если я определю эти макросы в начале заголовочного файла, проект скомпилируется отлично.

Есть ли способ решить эту проблему? Или я должен жестко закодировать класс, чтобы использовать либо char или же wchar_t ?

Благодарю.

1

Решение

Вы получаете ошибку компоновщика, потому что вы определяете UNICODE/_UNICODE макросы внутри main.cpp, но не в реализации вашего класса .cpp. Таким образом, когда main.cpp включает заголовочный файл вашего класса, он видит TCHAR как wchar_t, но когда ваша реализация .cpp включает ваш заголовочный файл, он видит TCHAR как char вместо. У вас есть несоответствие, которое вызывает ошибку компоновщика, потому что main.cpp вызывает wchar_t конструктор, который вы на самом деле не реализовали.

Вы должны искать наличие UNICODE/_UNICODE макросы, а не определять их вручную. Установите опцию «Набор символов» на MBCS или Unicode, чтобы IDE / компилятор мог управлять макросами глобально для всего проекта в целом для вас. Я не знаю, что на самом деле делает установка «Не установлено», но это не то, что вам действительно нужно в этой ситуации.

3

Другие решения

Макросы — это препроцессорные конструкции, которые, очевидно, сбивают вас с толку. Ваш код, даже если вы добьетесь успеха, будет сбивать с толку и других. Макросы UNICODE а также _UNICODE должны быть определены до TCHAR определяется, определяя их раньше TCHAR используется слишком поздно. Лучше оставить это в настройках вашего проекта.

Установить проект Character Set в Unicodeэто набор символов, который Windows использует внутри себя в любом случае. Тогда что TCHAR является wchar_t и макросы вызова API Something() всегда расширяться до SomethingW(), Ты можешь использовать char а также wchar_t явно везде и читатели кода точно увидят что к чему, без смутного и неясного TCHAR для них.

Функции Windows API SomethingA() просто фантики вокруг SomethingW() поэтому использование версий А неэффективно. Если вам когда-либо понадобится вызвать функцию API SomethingA(), затем сделайте это явно, чтобы все видели, что вы должны были сделать что-то неэффективное.

1

По вопросам рекламы [email protected]