GCC是不符合标准的?

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

我知道很少有编译器真正支持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的要求。会是什么问题呢?

c multithreading c11
1个回答
5
投票

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. 我不认为这在这个特定的情况下是重要的。

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