混合使用 UNICODE 和 non-UNICODE 翻译单元安全吗?
Is it safe to mix UNICODE and non-UNICODE translation units?
我正在集成一个需要定义 _UNICODE
和 UNICODE
的库;我现在无法在我的项目中全局设置这些定义,所以我想知道我是否可以安全地仅使用这些定义构建库代码。
我担心 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?
也许,也许不是。
我正在集成一个需要定义 _UNICODE
和 UNICODE
的库;我现在无法在我的项目中全局设置这些定义,所以我想知道我是否可以安全地仅使用这些定义构建库代码。
我担心 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?
也许,也许不是。