GCC 不符合标准?
GCC is non-conforming?
我知道很少有编译器真正支持 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__
,post-C11 也不会定义支持线程的编译器和库。因此,正确的检查需要如下所示:
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
#include <threads.h>
否则 compiler/library 的旧版本将无法工作。在您的情况下,您似乎在 Windows 下使用 Mingw,在这种情况下使用了不兼容的 Microsoft CRT(它不符合 C99 及更高版本)。
使用更高版本的 libc 的更高版本的 gcc 似乎可以与原始代码一起正常工作。
请注意,除非您使用 -std=c17 -pedantic-errors
编译,否则 gcc 不应被视为符合标准的实现。我认为在这种特定情况下这并不重要。
我知道很少有编译器真正支持 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__
,post-C11 也不会定义支持线程的编译器和库。因此,正确的检查需要如下所示:
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
#include <threads.h>
否则 compiler/library 的旧版本将无法工作。在您的情况下,您似乎在 Windows 下使用 Mingw,在这种情况下使用了不兼容的 Microsoft CRT(它不符合 C99 及更高版本)。
使用更高版本的 libc 的更高版本的 gcc 似乎可以与原始代码一起正常工作。
请注意,除非您使用 -std=c17 -pedantic-errors
编译,否则 gcc 不应被视为符合标准的实现。我认为在这种特定情况下这并不重要。