C 中未声明的 math_errhandling(Windows 10 操作系统)

问题描述 投票:0回答:1

我试图了解 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
这个东西有点不可携带而且神秘。

c errno
1个回答
0
投票

你一定做错了什么,看到编译器的完整路径让我想,你正在手动调用它。如果是这种情况,您不应该检查 [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 等)),但这不是其中之一。

© www.soinside.com 2019 - 2024. All rights reserved.