我有一个使用一组头文件编译的库,并将头文件复制到一个文件夹中,将所有头文件放在 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/