c++ - 具有预处理器分支实现的结构是否违反了 ODR?

标签 c++ c struct one-definition-rule

在同时使用 C 和 C++ 的项目中,.h 文件包含类型的定义。如果该定义取决于 header 是否包含在 ccpp 文件中,我是否违反了单一定义规则?

// 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/

相关文章:

c++ - boost 绑定(bind)编译错误

c - 显然已声明的变量被视为未声明

c - 单周期乘法和硬件除法是什么意思?

c - 如何安全地将两个可变大小的数据类型(结构)放在一个结构中?

c++ - 结构tm时间; vs tm 时间 = {}。输出相同但不一样?

C++:打印数据,printf

c++ - 如何确定 C++ 控制台应用程序中的当前键盘语言?

c++ - 为什么我的 while 循环不接收新输入 (c++)

c - 仅从 C 代码中提取函数名称及其注释

c# - 我应该使用静态类还是结构以外的其他东西?