我用C编写了一个基本的“Hello World”程序:

#include <stdio.h>

int main()
{
        printf("Hello World!\n");
        return 0;
}

然后,我在MSVC中从命令行编译它:
cl hello.c /Fd:hello.pdb /Zi /MD /link /NODEFAULTLIB:LIBCMT.LIB
命令行参数基本上是说“生成一个PDB文件并链接到MSVCRT.LIB而不是LIBCMT.LIB”。
然后,我反汇编了程序,查看了各种样板/CRT函数,在反汇编中发现了这一点,这很奇怪:
__matherr:
  00401550: 33 C0              xor         eax,eax
  00401552: C3                 ret

这基本上是一个函数,每当调用它时,它总是在EAX中返回0根据该函数的the documentation,当存在数学错误时返回0,当不存在错误时返回非0。
是否有人知道为什么这个函数(在数学错误的情况下应该返回0)包含在可执行文件中,并且被硬编码为始终返回0?

最佳答案

如果检测到数学异常,则应该从各种数学函数调用matherr默认实现什么也不做在某些平台上,可以用用户定义的代码(ELF系统上的“函数插入”)选择性地替换C库函数,这样就可以实现自己的数学错误处理程序不过,这在Windows上的可移植可执行文件(PE)中是不可能的我想matherr是CRT的一部分只是出于兼容性的原因。

关于c - 样板CRT功能Matherr有什么意义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32675994/

10-11 21:12