当前位置: 首页 > 知识库问答 >
问题:

澄清C与C++中结构ODR规则的差异

严峰
2023-03-14

我知道ODR、链接、staticextern“c”如何使用函数。但是我不确定类型的可见性,因为它们不能声明为static,而且C中没有匿名命名空间。

我特别想知道以下代码如果编译为C和C++的有效性

// A.{c,cpp}
typedef struct foo_t{
    int x;
    int y;
} Foo;

static int use_foo() 
{ 
    Foo f;
    f.x=5;
    return f.x;
}
// B.{c,cpp}
typedef struct foo_t{
    double x;
} Foo;

static int use_foo() 
{ 
    Foo f;
    f.x=5.0;
    return f.x;// Cast on purpose
}

使用以下两个命令(我知道两个编译器都基于扩展自动检测语言,因此名称不同)。

    null

我在这里不确定,我已经读到类型被认为是静态的,这将使程序有效。有人能确认一下吗?

如果这些定义在公共头文件中,可能在不同的C库中,而一个C++程序包含了这两个定义,每个定义也在不同的TU中,这会是ODR吗?如何才能防止这种情况呢?extern“c”起什么作用吗?

共有1个答案

狄心水
2023-03-14

对于C语言,我将使用C11的n1570草案和C++语言的n4860草案作为参考。

>

  • C语言

    类型在C:6.2.2中没有链接标识符的链接§6:

      null

    当一个名称可能与另一个范围中的声明引入的名称表示相同的对象、引用、函数、类型、模板、命名空间或值时,称为具有链接

    • §4

    未命名的命名空间或在未命名的命名空间内直接或间接声明的命名空间具有内部链接。所有其他名称空间都有外部链接。具有命名空间作用域的名称,但上面没有给出内部链接,即
    ...
    命名类...
    ...
    的名称,其链接确定如下:
    -如果封闭的命名空间具有内部链接,则该名称具有内部链接;
    -否则,如果名称的声明附加到命名模块(10.1)并且没有导出(10.2),则该名称具有模块链接;
    -否则,名称具有外部链接

  •  类似资料:
    • 我们有dynamic_cast的一般形式: dynamic_cast (表达式) 我特别对这条规则(5a)的粗体部分感到困惑: 5:如果expression是指向多态类型基的指针或引用,而new-type是指向派生类型的指针或引用,则执行运行时检查: a)检查由表达式指向/标识的最派生对象。如果在该对象中,表达式指向/引用派生的公共基,并且如果仅有一个派生类型的对象从由表达式指向/标识的子对象派生

    • 本文向大家介绍C++与C的差异分析,包括了C++与C的差异分析的使用技巧和注意事项,需要的朋友参考一下 虽说C++是向后兼容C的,但C++与C还是存在许多差异。本文列举了几个例子加以说明,同时这些也是我们非常容易忽略的地方。本文仅简单的列举几例,更多的不同之处读者还需要在学习与实践中不断的进行发掘和总结。 C编译通过但C++编译不通过: 1、C++中编译器不允许在一个函数声明之前调用它,但C中编译

    • 下面的getValue()成员函数是否违反了c严格别名规则? 根据该标准,我认为setValue()违反了严格的混淆现象,因为Double既不是聚合类型,也不是IEEE754_64的基类。 getValue()呢?当数据成员采用位字段形式时,它是否是一种未定义的行为,如下例所示? 我正在一个大型项目中使用类似的代码。GCC-O2和-O3输出错误值。如果我添加-fno严格的别名,问题就不存在了。此外

    • 作为C语言中实现定义行为的一个例子,C标准说数据类型的大小由实现定义。所以,假设是实现定义的。 > 编译代码后,当我在不同版本的平台上运行它时,实现依赖关系是否仍然适用?在一个平台上编译实现定义的代码并在另一个平台上运行它会导致性能损失吗?

    • 我试图在一个Swift项目中使用amazon-kinesis-video-streams-webrtc-sdk-c,但是我不确定如何创建一个SignalingClientInfo结构。具体地说,我不确定如何正确地构造:

    • 问题内容: 我正在寻找使用C或Python编写的规则引擎,但是如果您知道用另一种语言实现的规则引擎,我将非常高兴知道。 该引擎将用作使房屋自动化的方式,例如当有人离开房间等时关闭电灯等。因此,那里没有“办公室”规则(也就是您在Excel等程序中规则)。 我研究了Java中的Jess和Drools,它们做得很出色。我想知道其他人,并且可能使用的内存少于Java。我听说过Python中的RuleCor