【问题标题】:No Global variable initialization没有全局变量初始化
【发布时间】:2016-10-03 12:01:03
【问题描述】:

当我使用我的类实现之一在现有 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

为什么在第二种情况下会错过全局变量初始化?

【问题讨论】:

  • 请修正您的打字错误,您的案例 1 和案例 2 有什么区别?
  • cpp中的第一种情况与其他大代码和新文件中的第二种情况

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


【解决方案1】:

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

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

由于您的可执行文件没有明确引用TestStruct 类,因此该模块没有链接到您的可执行文件,也没有成为最终可执行文件的一部分。

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

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

【讨论】:

  • 目标文件中不存在类。这个答案对“TestStruct 类实际上适用于变量t,对吧?
  • 那个,以及类的构造函数。
  • 当然,但构造函数本身的存在并不是问题的真正主题,我想说。创建t时它会调用它。
  • 谢谢它的工作,当我在 main.cpp 中使用 TestStruct 时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
相关资源
最近更新 更多