gpt4 book ai didi

c++ - 没有全局变量初始化

转载 作者:可可西里 更新时间:2023-11-01 18:29:12 24 4
gpt4 key购买 nike

当我使用我的类实现之一将此代码添加到现有 cpp 中时

#include <iostream>

struct TestStruct{
TestStruct(int i)
{
std::cerr << i << std::endl;
x = i;
}
int x;
};

TestStruct t(8);

它在 main 执行之前打印 8。

但是当我创建新的空文件 test.cpp 并将相同的代码放入其中时,什么也没有打印出来。我检查了这个 cpp 是否被编译和链接。所有 cpp 文件都编译为静态库,然后将这个库与 main.o 链接到可执行文件中。我使用 g++ 5.3 唯一的选项是 -std=C++14

为什么在第二种情况下全局变量初始化被遗漏了?

最佳答案

您将 TestStruct 类作为单独的模块添加到静态库中,并将其与您的可执行文件链接。

使用静态库的全部目的是,只有那些具有您正在链接的可执行文件引用的任何符号、类或其他资源的模块——它们才会链接到可执行文件中。静态库中没有任何被主可执行文件直接或间接引用的符号的模块不会链接到主可执行文件中。这就是静态库的意义所在。

因为您的可执行文件没有显式引用 TestStruct 类,所以该模块没有链接到您的可执行文件中,也没有成为最终可执行文件的一部分。

但是当您在可执行文件已经引用和使用(直接或间接)的现有模块中添加 TestStruct 类时,该类以及其他模块中的所有其他符号和类, 链接到您的可执行文件并成为最终可执行文件的一部分。

因为您的可执行文件引用了其他模块中的某些符号或其他资源,所以该模块中的所有内容(包括测试类)都链接到可执行文件中。

关于c++ - 没有全局变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37614050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com