【发布时间】:2020-07-01 04:35:01
【问题描述】:
我正在使用 TCHAR,但在定义 UNICODE / _UNICODE 时出现错误。这是我的代码。
function.h
#define UNICODE
#define _UNICODE
#include <tchar.h>
#include <windows.h>
BOOL bLogging(LPCTSTR szContent, ...);
function.cpp
#include "function.h"
BOOL bLogging(LPCTSTR szContent, ...)
{
body of function
}
plugin.cpp
#include "function.h"
bool pluginInit(PLUG_INITSTRUCT* initStruct)
{
bLogging(TEXT("hello, world!"));
}
上面的代码出错了
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
LNK2019 unresolved external symbol "int __cdecl bLogging(char const *,...)" (?bLogging@@YAHPBDZZ) referenced in function "bool __cdecl pluginInit(struct PLUG_INITSTRUCT *)" (?pluginInit@@YA_NPAUPLUG_INITSTRUCT@@@Z)
但如果没有 UNICODE / _UNICODE,它构建为 ASCII 字符,它工作得很好。
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
【问题讨论】:
-
确保您进行了全面清理和重建,并注意
#include以外的function.h。在编译器设置中使用#define全局变量(如UNICODE和_UNICODE)通常比单独的头文件更安全。 -
添加了 Windows 和 WinApi 标签。删除 C++ 标记。
-
从错误信息可以看出
LPCTSTR仍然是ANSIchar const*,所以你的#define UNICODE没有生效。我的猜测是有人在包含你的标题之前已经做了一个#include <windows.h>,所以你定义UNICODE太晚了。 -
在我看来
LPCTSTR正在做正确的事情,但TEXT不是。 -
发布后,代码不会产生错误。错误出现在我们看不到的地方。例如,使用预编译的头文件是引入不匹配的预处理器符号的一种方法。