在同时使用 C 和 C++ 的项目中,.h
文件包含类型的定义。如果该定义取决于 header 是否包含在 c
或 cpp
文件中,我是否违反了单一定义规则?
// my_header.h
struct MyStruct
{
#ifdef __cplusplus
std::size_t member;
int surprise;
#else
unsigned member;
#endif
};
我知道 ODR 与不同的翻译单元有关,但在“我的情况”中,不同的翻译单元最终不会对一个通用结构有不同的实现吗?我在生产代码中看到过这一点,最初我想知道链接器在这种情况下做了什么。
有什么想法吗?
最佳答案
只要您使用一种编译器(C 或 C++),就不会有问题。头文件的扩展名无关紧要。
但是,如果您将来自不同语言的翻译单元链接在一起,那么是的,您违反了 ODR。
总的来说,这看起来很容易出错。我会给 C++ 类型一个完全不同的名称。您可以使用宏在两者之间切换,也许使用围绕 typedef
?
关于c++ - 具有预处理器分支实现的结构是否违反了 ODR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801137/