在哪个版本的C中引入了_Bool类型?

时间:2014-10-14 10:19:37

标签: c gcc

关于SO的this 问题的答案指明在C99中引入了_Bool(具体而言 BobbyShaftoe的回答)。

但是下面的代码与gcc -std=c90 -pedantic test.cgcc -std=c89 -pedantic test.c完全编译,产生输出1(我的gcc版本是4.7.1)

#include<stdio.h>
#include<stdlib.h>

int main(){

    _Bool a = 0;
    printf("%u\n",sizeof(a) );
    return 0;
}

那么_Bool引入了哪个版本?

1 个答案:

答案 0 :(得分:2)

正如@ 0xC0000022L指出的那样,您需要区分标准实施和实际实施。有趣的是,GCC(以及Clang)如何对待_Bool仍有一些不一致之处。 C99还引入了_Complex类型,其中有诊断消息:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("%lu\n", (unsigned long) (sizeof(_Complex)));
    return 0;
}

结果(GCC 4.4.7):

$ gcc -ansi -pedantic-errors check.c 
check.c: In function ‘main’:
check.c:5: error: ISO C90 does not support complex types
check.c:5: error: ISO C does not support plain ‘complex’ meaning ‘double complex’

您可以检查源代码,然后您会发现确实_Complex类型是针对标准版本检查的,而_Bool则不是:

gcc/po/gcc.pot:19940

#: c-decl.c:7366
#, gcc-internal-format
msgid "ISO C90 does not support complex types"
msgstr ""

gcc/c-decl.c:7380

case RID_COMPLEX:
  dupe = specs->complex_p;
  if (!flag_isoc99 && !in_system_header)
pedwarn (input_location, OPT_pedantic, "ISO C90 does not support complex types");

我不会把它称为错误,而是由开发人员做出的决定。