我知道很少有编译器真正支持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 (Windows10 x64),带有__STDC_VERSION__ = 201710L (所以是C17)。如果您不能判断,问题是我的编译器没有定义__STDC_NO_THREADS__或<threads.h>,这不符合C11。问题是什么?
发布于 2020-05-19 10:19:08
预C11编译器和库不会定义__STDC_NO_THREADS__,也不会为线程提供支持的后C11编译器和库。因此,正确的检查需要如下所示:
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
#include <threads.h>否则,编译器/库的旧版本将无法工作。在您的示例中,您似乎是在Windows下使用明威,在这种情况下使用的是不兼容的Microsoft (它不符合C99及其他版本)。
使用libc后期版本的gcc的后期版本似乎与原始代码正确地工作。
请注意,除非您使用-std=c17 -pedantic-errors编译,否则gcc不会被视为符合规范的实现。我不认为这在这件案子中有什么关系。
https://stackoverflow.com/questions/61887795
复制相似问题