c - GCC 不合格?

标签 c multithreading c11

我知道很少有编译器真正支持 C11 线程(这很遗憾,但无论如何)。 C11 标准要求不支持线程的实现定义 __STDC_NO_THREADS__ 。然而这个程序似乎给出了一个错误:

#include <stdio.h>
#ifndef __STDC_NO_THREADS__
    #include <threads.h> //error is here
#endif // __STDC_NO_THREADS__

int main(void)
{
    #ifdef __STDC_NO_THREADS__
        printf("There are no threads");
    #else
        printf("There are threads");
    #endif // __STDC_NO_THREADS__
}

//Error at line 3: fatal error: threads.h: No such file or directory

编译器版本为 GCC 9.2.0 (Windows 10 x64),__STDC_VERSION__ =201710L (所以是C17)。如果你看不出来,问题是我的编译器没有定义 __STDC_NO_THREADS__<threads.h> ,不符合 C11。可能是什么问题?

最佳答案

C11 之前的编译器和库不会定义 __STDC_NO_THREADS__ ,C11 之后的支持线程的也不会。因此,正确的检查需要如下所示:

#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
  #include <threads.h>

否则旧版本的编译器/库将无法工作。在您的情况下,您似乎在 Windows 下使用 Mingw,在这种情况下使用不兼容的 Microsoft CRT(它不符合 C99 及更高版本)。

使用更高版本的 libc 的更高版本的 gcc 似乎可以与原始代码一起正常工作。

请注意,除非使用 -std=c17 -pedantic-errors 进行编译,否则 gcc 不会被视为一致的实现。 。我认为在这种具体情况下这并不重要。

关于c - GCC 不合格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61887795/

相关文章:

c++ - 需要慢速插入链表多线程吗?

c - 固定长度类型 > 64 in C

python - 如何使用字典作为输入进行多线程?

java - 在 Swing 的 EDT 中实现线程?

c - 变量名作为宏参数

c - Mingw-w64 C版本支持吗?

c - 匿名结构的初始化,gcc 4.9 的解决方法

c - system() 返回非零但仍执行操作

C编程返回0而指针指向值3

java - 如果一个类有一个内部类并且内部类运行一个线程,那么内部类线程是否彼此共享外部类的相同字段?