c++ - 使用 C++ 中的两个略有不同的头文件(尽管有一个 .lib 文件)导致大量错误,但没有生成警告。如何预防?

标签 c++ debugging visual-studio-2012 warnings static-libraries

我有一个使用一组头文件编译的库,并将头文件复制到一个文件夹中,将所有头文件放在 MSVC 包含搜索路径中。

但是编译后的 .lib 具有不同的 header 集,并且使用该 header 文件的我的程序使用的是原始(未更改)的 header 文件集。 我注意到问题是调试器显示了错误的值。例如我正在设置

mystruct->item1 = 1

但是在这行之后调试器显示 mystruct->item1 = 0。尽管打印它很好。 但后来我注意到将此结构传递给库函数具有不同的值。 这让我意识到存在不同的结构。

由于结构的大小不同,我认为编译器应该理解这一点并生成警告。 (我没有得到任何)。 我花了几天时间来调试这个问题,我想知道类似的情况如何防止它发生?例如,如果有一个编译器开关可以帮助为此类情况生成警告。或者我怎样才能防止像这样的令人讨厌的错误?

最佳答案

As size of structures are different, I think compilers should understand this and generate warnings.

问题是,当您将代码与库的代码连接起来时,编译器已经无法使用了。进行连接的程序(链接器)不知道它尝试连接的两个二进制代码使用不同大小的结构 - 事实上,链接器根本不知道程序使用任何数据结构:它在不同级别。

这就是为什么 C++ 工具链中的工具不可能为您生成可靠的警告。然而,这并不意味着您无法自己阻止它:它所需要的只是将某种内部版本号嵌入到库及其 header 中,并在初始化库时比较两者。

关于c++ - 使用 C++ 中的两个略有不同的头文件(尽管有一个 .lib 文件)导致大量错误,但没有生成警告。如何预防?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22445845/

相关文章:

C++ 线程间通信

c++ - 事件窗口更改时收到通知

ios - 解释 iPhone 崩溃日志/堆栈跟踪

c++ - Visual Studio 2012 项目文件 ""已重命名或不再在解决方案中

c++ - Fortran Do 循环的上限

debugging - 如何使用Eclipse在MapReduce的主节点中调试工作程序节点?

c++ - 运行我的程序的 gdb 和运行我的程序的 bash 显示不同输出的原因可能是什么?

c# - Microsoft.Web.Infrastructure,Version=1.0.0.0 无法在 Windows 2012 64 位、MVC5 上加载

c# - Visual Studio 中一个项目的两个站点

c++ - 复制构造函数和动态内存