问题
网上验证一个单链表是否有环的c语言demo,放到gcc9.1.0的环境下编译,发现编译报错:
error:‘true’undeclared(firstuseinthisfunction)
分析
发现是demo里使用到的true和flase编译报错了,原来gcc9.1.0下bool关键字还未支持。
深入分析后发现,原来C语言(C99之前)中没有bool关键字。在C语言编程时,我们都是使用BOOL,但BOOL不是内置类型,一般都是通过typedef或者宏来定义的,通常都会被定义成int类型。
typedefintBOOL;
#defineTRUE1
#defineFALSE0
后来的C++出现了内置类型bool,值为true(真)和false(假)。为了与C++兼容,C99标准新增的头文件stdbool.h头文件中引入bool关键字。
//
//stdbool.h
//
//Copyright(c)MicrosoftCorporation.Allrightsreserved.
//
//TheCStandardLibrarystdbool.hheader.
//
#ifndef_STDBOOL
#define_STDBOOL
#define__bool_true_false_are_defined 1
#ifndef__cplusplus
#definebool _Bool
#definefalse 0
#definetrue 1
#endif/*__cplusplus*/
#endif/*_STDBOOL*/
/*
*Copyright(c)-byP.J.Plauger.ALLRIGHTSRESERVED.
*Consultyourlicenseregardingpermissionsandrestrictions.
V5.30:*/
解决
法1:
由于我是单独跑demo验证的,所以我就写了一个宏定义来保证编译通过就行了了。
typedefenum__bool
{
false=0,
true=1
}bool;
法2:
在源文件中包含stdbool.h头文件即可。
#includestdbool.h
番外
针对C99标准(ISO/IEC:),毫不夸张地说,即便到目前为止,很少有C语言编译器是完整支持C99的。像主流的GCC以及Clang编译器都能支持高达90%以上,而微软的VisualStudio中的C编译器只能支持到70%左右。
所以建议大家在进行C/C++混合编程时,一定要注意代码兼容性。特别是注意一些编程语言特有的关键字与语法等,不能混为一谈,尽量避免不必要的麻烦。
引经据典