我知道很少有编译器真正支持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__。__STDC_NO_THREADS__
,C11后的支持线程的也不会。所以正确的检查需要像这样。
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
#include <threads.h>
否则旧版本的编译器库将无法工作。在你的例子中,你似乎是在Windows下使用Mingw,在这种情况下,你使用的是不兼容的微软CRT(它不符合C99及以后的版本)。
后来的gcc版本使用后来的libc版本,似乎可以正确地使用原始代码。
请注意,gcc不能被认为是一个符合标准的实现,除非你用了 -std=c17 -pedantic-errors
. 我不认为这在这个特定的情况下是重要的。