Visual Studio 警告 C4743:整个程序优化如何影响 _fltused?

5 c++ linker visual-studio-2005

因此,在工作中,我正在开发一个无需 C++ 运行时库即可运行的 C++ 应用程序。我们使用的是 Visual Studio 2005,并指定了 /NODEFAULTLIB 开关。

该解决方案的组织方式包括各种静态库项目,然后是使用这些库的单个可执行项目。这些库大多是在单独的存储库中跟踪的常见库。它们可以改变,但如果可以避免的话,我们最好不要改变。

这些常见库之一使用浮点数学。由于我们没有 C++ 运行时,因此我们自己定义了这些例程(例如:_ftol2_sse用于将 float 转换为 int)。

根据我对底层细节的(相当有限的)理解,编译器发出_fltused需要使用浮点数学例程的符号信号。

由于某种原因,其他公共库之一决定手动定义此符号,如

extern "C" { unsigned short _fltused = 0; };
Run Code Online (Sandbox Code Playgroud)

当我启用整个程序优化和链接时代码生成时,我得到

warning C4743: '_fltused' has different size ...
Run Code Online (Sandbox Code Playgroud)

链接时。我不知道为什么我们将其声明为unsigned short而不是int,但事实就是这样。

当我不启用整个程序优化或 LTCG 时,警告就会消失。

我想我有两个问题。

  1. 我可以安全地忽略这个警告吗?
  2. 正在进行哪些优化导致出现警告?我不确定为什么在没有启用整个程序优化的情况下它不是一个警告。

更新

我找到了该代码的原始作者,他承认这是从汇编语言重写代码时出现的错误。他同意我的观点,即该警告是无害的,因为_fltused从未实际直接使用过。

Mar*_*k B 4

我想我至少可以回答2个。这并不是进行任何具体的优化。事实上,整个程序优化迫使编译器保留整个程序的某些表示形式可供优化,并且根据该中间表示形式,它能够确定同一变量具有不同的大小。当未启用整个程序优化时,编译器仅单独查看每个源文件,而不会看到两个不同的文件为该符号定义了不同的类型。

综上所述,我 99% 确定您的程序违反了一条定义规则:“未定义的行为,无需诊断”。如果你有机会修复它,你应该修复它,防止像编译器补丁破坏你的代码这样简单的事情。