Visual Studio警告C4743:整个程序优化如何影响fltused? 所以我在工作,在C++应用程序上运行,没有C++运行时库。我们正在使用VisualStudio2005,并指定了/NODEFAULTLIB开关

Visual Studio警告C4743:整个程序优化如何影响fltused? 所以我在工作,在C++应用程序上运行,没有C++运行时库。我们正在使用VisualStudio2005,并指定了/NODEFAULTLIB开关,c++,linker,visual-studio-2005,C++,Linker,Visual Studio 2005,该解决方案的组织方式是,存在各种静态库项目,然后是使用这些库的单个可执行项目。这些库大多是在单独的存储库中跟踪的公共库。它们是可以改变的,但如果我们能避免的话,最好不要改变 其中一个公共库使用浮点数学。因为我们没有C++运行时,所以我们定义了这些例程,我们自己(EX: 根据我对底层细节的理解(相当有限),编译器发出需要使用浮点数学例程的符号\u fltused信号 出于某种原因,其他公共库之一决定手动定义此符号,如下所示: extern "C" { unsigned short _fltused

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

其中一个公共库使用浮点数学。因为我们没有C++运行时,所以我们定义了这些例程,我们自己(EX:<代码> 根据我对底层细节的理解(相当有限),编译器发出需要使用浮点数学例程的符号
\u fltused
信号

出于某种原因,其他公共库之一决定手动定义此符号,如下所示:

extern "C" { unsigned short _fltused = 0; };
当我启用整个程序优化和链接时代码生成时,我得到

warning C4743: '_fltused' has different size ...
链接时。我不知道为什么我们把它声明为
无符号短
而不是
int
,但事实就是这样

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

我想我有两个问题

  • 我可以安全地忽略这个警告吗
  • 正在进行哪些优化以导致出现警告?我不知道为什么在没有启用整个程序优化的情况下,它不是一个警告
  • 更新


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

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


    所有这些都表明,我99%确信您的程序违反了一个定义规则,“未定义的行为,无需诊断”。如果你有机会修复它,你应该做一些简单的事情,比如编译器补丁破坏你的代码。

    关于一个定义规则的观点很好,但我不确定情况是否如此。如果我注释掉库中提供的
    \u fltused
    定义,我会得到一个未解决的外部符号错误。这是否意味着使用浮点数学的库只生成一个声明,并且它将符号声明为
    int
    ?@njpaul:One定义规则管辖的不仅仅是定义。然而,这种特殊情况违反了链接3.5:“在所有类型调整之后(在此期间,typedef(7.1.3)替换为其定义),引用给定变量或函数的所有声明指定的类型应相同,但数组对象的声明可以指定因存在或不存在主数组边界而不同的数组类型(8.3.4)。违反此类型标识规则不需要诊断规则,也不需要一个定义规则