全局变量不初始化

7
当我将这段代码添加到已有的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有什么区别? - Khalil Khalaf
在 cpp 中的第一个案例与其他大型代码一起,而第二个案例则在新文件中。 - Sergey Kolesov
1个回答

8
您将TestStruct类作为单独的模块添加到静态库中,并将其与可执行文件链接。使用静态库的整个目的是,只有在您链接的可执行文件引用了任何符号、类或其他资源的模块才会被链接到可执行文件中。静态库中没有任何被主可执行文件直接或间接引用的符号的模块不会被链接到主可执行文件中。这就是静态库的全部内容。
由于您的可执行文件没有对TestStruct类进行显式引用,因此该模块未被链接到您的可执行文件中,也未成为最终可执行文件的一部分。
但是,当您将TestStruct类添加到已经被您的可执行文件直接或间接引用和使用的现有模块中时,该类以及来自其他模块的所有其他符号和类都会被链接到您的可执行文件中,并成为最终可执行文件的一部分。
因为您的可执行文件引用了那个其他模块中的某些符号或其他资源,所以该模块中的所有内容,包括测试类,都会被链接到可执行文件中。

类在对象文件中不存在。这个答案所说的关于“类TestStruct”的内容实际上适用于变量t,对吗? - Angew is no longer proud of SO
那个,还有类的构造函数。 - Sam Varshavchik
当然可以,但我认为构造函数本身并不是问题的重点,而是在创建t时调用它。 - Angew is no longer proud of SO
谢谢,当我在main.cpp中使用TestStruct时它可以工作。 - Sergey Kolesov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接