c++ - 混合使用 UNICODE 和非 UNICODE 翻译单元是否安全?

标签 c++ visual-c++ unicode one-definition-rule

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

我担心 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/

相关文章:

C++ 如何将整数转换为字符串?

c++ - 出于测试目的故意让 C++ 程序运行得更慢?

C11 Unicode 支持

c++ - 对象未在 vector 中正确存储/检索 (C++)

c++ - android + pthread + c++ = SIGSEGV

c++ - 获取同级别的标签?

unicode - 为什么 Unicode 代码点总是至少用 2 个字节编写?

c++ - 如何在 C++ Linux 中使用 ICU 库将 UnicodeString 转换为 windows-1251?

c++ - 将指向数据的指针作为参数传递给需要二维数组的函数

c++ - "integral"类型的函数重载