c语言 gcc9.1.0环境下编译报错error: ‘true’ undeclared (first use in this function)

Posted 谁吃薄荷糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 gcc9.1.0环境下编译报错error: ‘true’ undeclared (first use in this function)相关的知识,希望对你有一定的参考价值。

问题

网上验证一个单链表是否有环的c语言demo,放到gcc9.1.0的环境下编译,发现编译报错:
error: ‘true’ undeclared (first use in this function)

分析

发现是demo里使用到的trueflase编译报错了,原来gcc9.1.0下bool关键字还未支持。
深入分析后发现,原来C语言(C99之前)中没有bool关键字。在C语言编程时,我们都是使用BOOL,但BOOL不是内置类型,一般都是通过typedef或者来定义的,通常都会被定义成int类型。

  typedef int BOOL;

  #define TRUE 1

  #define FALSE 0

后来的C++出现了内置类型bool,值为true(真)和false(假)。为了与C++兼容,C99标准新增的头文件stdbool.h头文件中引入bool关键字

//
// stdbool.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// The C Standard Library <stdbool.h> header.
//
#ifndef _STDBOOL
#define _STDBOOL

#define __bool_true_false_are_defined	1

#ifndef __cplusplus

#define bool	_Bool
#define false	0
#define true	1

#endif /* __cplusplus */

#endif /* _STDBOOL */

/*
 * Copyright (c) 1992-2010 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
V5.30:0009 */

解决

法1:

由于我是单独跑demo验证的,所以我就写了一个宏定义来保证编译通过就行了了。

typedef enum __bool 
{ 
    false = 0, 
    true = 1 
} bool;

法2:

在源文件中包含stdbool.h头文件即可。

#include <stdbool.h>

番外

针对C99标准( ISO/IEC 9899: 1999),毫不夸张地说,即便到目前为止,很少有C语言编译器是完整支持 C99 的。像主流的 GCC 以及 Clang 编译器都能支持高达90%以上,而微软的 Visual Studio 2015 中的C编译器只能支持到 70% 左右。

所以建议大家在进行C/C++混合编程时,一定要注意代码兼容性。特别是注意一些编程语言特有的关键字与语法等,不能混为一谈,尽量避免不必要的麻烦。

引经据典

http://c.biancheng.net/view/143.html

以上是关于c语言 gcc9.1.0环境下编译报错error: ‘true’ undeclared (first use in this function)的主要内容,如果未能解决你的问题,请参考以下文章

解决ubuntu下编译报错/usr/include/linux/errno.h:1:10: fatal error: asm/errno.h #yyds干货盘点#

解决ubuntu下编译报错/usr/include/linux/errno.h:1:10: fatal error: asm/errno.h #yyds干货盘点#

在linxu环境下编译redis报错

configure: error: APR not found. Please read the documentation

折腾了半天的linux generators上编译报错问题定位

error: failed to run custom build command for `openssl-sys v0.9.63`