2015-09-20 6 views
2

Я написал основную "Hello World" программу в C:Какова точка шаблона CRT-функции matherr?

#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 

В основном это функция, которая всегда возвращает 0 в EAX всякий раз, когда это называется. Согласно the documentation этой функции, она возвращает 0, когда есть математическая ошибка и не-0, когда нет ошибки.

Есть ли у кого-нибудь ответ, почему эта функция, которая должна возвращать 0 в случае математической ошибки, включена в исполняемый файл и жестко закодирована до всегда return 0?

+1

У вас есть исходный код CRT на вашем компьютере, посмотрите в каталоге vc/crt/src. Обратите внимание на комментарий: «По умолчанию matherr ничего не делает и возвращает 0». –

ответ

1

matherr предполагается вызывать из различных математических функций, если обнаружено математическое исключение. Реализация по умолчанию ничего не делает. На некоторых платформах можно выборочно заменить функции библиотеки C на пользовательский код («интерполяция функций» на ELF-системах), чтобы вы могли реализовать свой собственный обработчик ошибок математики. AFAIK, это невозможно с помощью Portable Executables (PE) в Windows. Я думаю, что matherr является частью CRT только по соображениям совместимости.