混合使用 UNICODE 和 non-UNICODE 翻译单元安全吗?

Is it safe to mix UNICODE and non-UNICODE translation units?

我正在集成一个需要定义 _UNICODEUNICODE 的库;我现在无法在我的项目中全局设置这些定义,所以我想知道我是否可以安全地仅使用这些定义构建库代码。

我担心 ODR 违规,但据我了解,这些定义只会影响 Windows 和 C 运行时 headers 中的 定义,所以我希望不会有 ODR 违规(只要我自己的 headers 在翻译单元之间共享不依赖于 UNICODE),但这真的是保证吗?

混合使用和不使用 UNICODE/_UNICODE 构建的翻译单元安全吗?

换句话说,将这两个文件编译成同一个二进制文件是否安全:

// a.cpp
#define _UNICODE
#define UNICODE
#include <tchar.h>
// maybe other windows header inclusion
// some code

// b.cpp
//#define _UNICODE
//#define UNICODE
#include <tchar.h>
// maybe other windows header inclusion
// some other code

如果在不同的翻译单元中有一个带有 _TEXT()/TCHAR/... 的内联函数,一个定义了预处理器,一个没有定义(即使没有使用函数),那么你ODR-违规。

"is it safe?"

没有

Do you have currently ODR violations?

不确定,也许,也许不是。

目前tchar.h只有#define/typedef一些别名。所以它本身不会违反 ODR。

Can Microsoft change <tchar.h> or other windows headers in a way it might produce ODR violation for your code?

是的。

Would they do it?

也许,也许不是。