gpt4 book ai didi

c - 样板 CRT 函数 matherr 有什么意义?

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:20 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com