我试图了解 errno 的内部工作原理,并尝试了 cppreference 中的以下示例文件,但在编译过程中出现错误:
$ gcc errno_ex.c
errno_ex.c: In function 'main':
errno_ex.c:33:10: error: 'math_errhandling' undeclared (first use in this function)
puts(math_errhandling & MATH_ERRNO ? "set" : "not set");
^~~~~~~~~~~~~~~~
errno_ex.c:33:10: note: each undeclared identifier is reported only once for each function it appears in
errno_ex.c:33:29: error: 'MATH_ERRNO' undeclared (first use in this function)
puts(math_errhandling & MATH_ERRNO ? "set" : "not set");
^~~~~~~~~~
(未修改的)示例代码是:
#include <stdio.h>
#include <math.h>
#include <errno.h>
void show_errno(void)
{
const char *err_info = "unknown error";
switch (errno) {
case EDOM:
err_info = "domain error";
break;
case EILSEQ:
err_info = "illegal sequence";
break;
case ERANGE:
err_info = "pole or range error";
break;
case 0:
err_info = "no error";
}
fputs(err_info, stdout);
puts(" occurred");
}
int main(void)
{
fputs("MATH_ERRNO is ", stdout);
puts(math_errhandling & MATH_ERRNO ? "set" : "not set");
errno = 0;
1.0/0.0;
show_errno();
errno = 0;
acos(+1.1);
show_errno();
errno = 0;
log(0.0);
show_errno();
errno = 0;
sin(0.0);
show_errno();
}
我不确定发生了什么。当我在 Windows 中用 VS code 进行编译时,会发生这些错误(C 编译器默认设置为
C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30037/bin/Hostx86/x86/cl.exe
,并使用 C17
标准)。
当我尝试在我的 Macbook VS 代码上复制此代码时,它编译时没有错误。所以我不确定问题出在哪里:我的编译器是否太旧而无法识别这些宏?
编辑: 我认为
math_errhandling
的宏定义是特定于平台的,因此在不同操作系统平台上不太可移植。 errno
宏在我基于 Windows 的 VS Code IDE 中仍然有效,我对此感到满意。只是math_errhandling
这个东西有点不可携带而且神秘。
你一定做错了什么,看到编译器的完整路径让我想,你正在手动调用它。如果是这种情况,您不应该检查 [SO]:如何构建 libjpeg 9b 的 DLL 版本? (@CristiFati 的回答)(来自部分的项目符号:#1。准备地面)。
这是一个工作示例。
main00.c:
#include <errno.h>
#include <math.h>
#include <stdio.h>
#pragma STDC FENV_ACCESS ON
int main()
{
printf("MATH_ERRNO: 0x%08X\n", MATH_ERRNO);
printf("MATH_ERREXCEPT: 0x%08X\n", MATH_ERREXCEPT);
printf("math_errhandling: 0x%08X\n", math_errhandling);
printf("EDOM: 0x%08X\n", EDOM);
printf("\nDone.\n\n");
return 0;
}
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\StackExchange\StackOverflow\q075000209]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> [prompt]> "c:\Install\pc032\Microsoft\VisualStudioCommunity\2019\VC\Auxiliary\Build\vcvarsall.bat" x64 > nul [prompt]> [prompt]> dir /b main00.c [prompt]> cl /nologo /MD /W0 main00.c /link /NOLOGO /OUT:main_win_pc064_vs19.exe main00.c [prompt]> [prompt]> main_win_pc064_vs19.exe MATH_ERRNO: 0x00000001 MATH_ERREXCEPT: 0x00000002 math_errhandling: 0x00000003 EDOM: 0x00000021 Done.
确实存在一些兼容性问题([SO]:GCC 中的数学错误条件(C99、C11 等)),但这不是其中之一。