我正在集成一个需要定义 _UNICODE
和 UNICODE
的库;我现在无法在我的项目中全局设置这些定义,所以我想知道是否可以安全地仅使用这些定义构建库代码。
我担心 ODR 违规,但据我了解,这些定义仅影响 Windows 和 C 运行时 header 中的宏定义,因此我预计不会出现 ODR 违规(只要我的翻译单元之间共享的自己的 header 不依赖于 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?
也许,也许不是。
关于c++ - 混合使用 UNICODE 和非 UNICODE 翻译单元是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69537024/