我在 VS2010 部分遇到了奇怪的行为。
我已经将这个简单的代码添加到两个.cpp 文件中,并在指定的代码行上放置了一个断点
namespace { class TestClass { public: TestClass() { printf(""); // ### BREAKPOINT_HERE } }; } TestClass a;
奇怪的是,一旦程序编译并运行,其中一个文件中的断点是正确的,而另一个文件中的断点会自动禁用并发出警告: '当前不会命中断点。没有为该文档加载任何符号。'
这两个 .cpp 文件都是以相同的方式创建的,并且具有完全相同的属性。 他们所在的项目有大量文件,但我遇到问题的文件不是最近添加的 - 有一些较新的文件没有出现问题。
谁能告诉我可能是什么问题?
干杯, 帕克萨斯
最佳答案
我认为问题不在于编译器,而在于链接器。如果它没有看到任何对库中模块中符号的显式访问,它就不会链接该模块。因此,该模块中的任何静态对象将永远不存在。
要了解为什么会这样,请回想一下 C++ 之前的时代。库的目的是将您可能需要的所有功能打包到一个文件中。链接器将遍历库中的每个模块,其中模块是通过编译单个源文件来定义的。如果程序需要模块中定义的符号,则该模块将被链接;如果没有,它将被跳过,这样库中未使用的部分不会使应用程序膨胀。
这个过程是递归的,所以如果模块 A 需要模块 B 的某些东西,即使程序没有直接需要它,模块 B 也会被链接。这是解决该问题的关键 - 确保您的库的主模块从包含您的静态初始值设定项的每个模块访问至少一个对象或函数。
关于c++ - 断点未命中静态链接库中的全局静态初始化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4556496/