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

标签 c++ g++ c++14

当我使用我的类实现之一将此代码添加到现有 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/

相关文章:

c++ - 如何延长表达式范围内临时变量的生命周期?

c++ - 是否可以在 C++ 中使用匿名类?

c++ - 如何避免 PANTHEIOS_FE_PROCESS_IDENTITY 的多重定义?

c++ - 为什么使用enable_if时is_same编译失败,但is_same_v通过

c++ - 优化编译时应该知道的if-else,但信息在不同的项目中

c++ - OpenACC - 私有(private)二维数组

客户端断开连接后,C++ TCP 服务器仍在读取数据

c++ - 试图重载 + 运算符

c++ - 必须使用普通旧数据的情况示例?

c++ - 是否有 g++ 标志可以在 switch 语句中检测并警告此无法访问的代码?