如何以复杂的方式创建一个联盟?

粉红龟

所以我在玩编译单元时偶然发现了这一点。

我有 2 个头文件定义了一个同名的类。第一个编译单元包含第一个头文件并声明一个指向类的外部指针,第二个编译单元包含第二个头文件并定义该指针。

现在我有 T* 指向一个 U。

微信:

h1.h

#pragma once
struct a_struct {
    int i;

    a_struct(int _i) : i{ _i } {}
};

小时2小时

#pragma once
struct a_struct {
    float f;

    a_struct(float _f) : f{ _f } {}
};

foo.h

#pragma once
struct foo {
    int bar();
};

cu1.cpp

#include "foo.h"
#include "h1.h"

extern a_struct* s;

int foo::bar() {
    return s->i;
}

cu2.cpp

#include "h2.h"

a_struct* s = new a_struct(1.0f);

主程序

#include "foo.h"
#include <iostream>

int main() {

    foo f;

    std::cout << f.bar() << std::endl; // <- 1065353216

    system("PAUSE");
    return 0;
}

为什么链接器看不到 h1.h::a_struct 不是 h2.h::a_struct ?这是在标准中提到的未定义行为吗?

(我也知道用相同的名字命名 2 个类是愚蠢的......)

杰弗里

编译器分别编译每个源文件。它相信给定的类声明对于所有源文件都是相同的。

当你这样做时,你欺骗编译器编译两个文件,为某个类编译两个不同的定义。每个文件都会生成一段自洽的代码。

然后链接器进入并将您的各种代码链接在一起。有一个对象/库格式在所有编译器之间共享。这是为了允许每个链接器与每个编译器一起工作。此时,链接器只知道某些代码将传递一个foo对象,而其他一些代码将接收一个foo对象。偷看、检查和抱怨不是它的事。

请记住,在链接时,源代码甚至可能不可用。您可能拥有某个供应商提供的没有源代码的库。并且可能有各种#defines 可能影响了这个对象。链接器不需要知道编译设置是什么,甚至不需要知道源是什么。代码甚至可以用另一种语言编写。

为了获得这种灵活性和互操作性,您必须遵循一些规则。其中之一是“不要以不同的方式两次定义同一个类”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何以编程方式创建第一个Azure Databrics令牌(PowerShell)

如何以编程方式在Android中创建另一个应用程序的快捷方式?

如何以组方式调用一个异步函数?

如何以动态单元格高度和自动布局以编程方式创建一个非常基本的UITableView?

如何以编程方式将新创建的记录链接到另一个表中的记录

一个受歧视的联盟如何覆盖.Equals()?

如何创建一个复杂的嵌套->属于对象?

如何创建一个复杂的Javascript对象

如何创建一个复杂的多维关联数组?

如何以矢量化方式每n个元素平均一个矩阵?

如何以一种简单的方式从C ++循环中删除最后一个逗号?

如何以编程方式在ggplot的一系列行中隔离一个行

创建一个复杂的模板?

创建一个复杂的盒子

如何以正确的方式完成一个频道?如何使用多个渠道?

创建一个使用 ggplot2 绘图的函数,并为该函数提供数据框、x 和 y。如何以正确的方式参考轴?

我有一个函数,可以创建数组并对其进行混洗,但是我不知道如何以我想要的方式调用它

如何以编程方式在顶部的垂直linearlayout中设置一个视图,在底部设置一个视图?

如何以数组或其他方式存储图像并一个接一个地检索

如何以静态方式使用另一个constexpr数组初始化一个数组

如何以编程方式从MaterializeCSS的选择中选择一个选项?

如何以线程安全的方式为每个 HTTP 请求维护一个对象?

如何以编程方式弹出视图控制器并显示一个新的

如何以编程方式在 QTableWidget 中选择一个单元格

如何以编程方式设置listview的仅一个元素的字体颜色?

如何以编程方式将文件复制到另一个目录?

如何以编程方式将文件复制到另一个目录?

如何以非迭代的方式将盒子散布到另一个盒子中?

如何以编程方式包括一个外部js文件,并确保先加载该文件?