「c語言 gcc9.1.0環境下編譯報錯」error:‘true’undeclared

問題

網上驗證一個單鏈表是否有環的c語言demo,放到gcc9。1。0的環境下編譯,發現編譯報錯:

error: ‘true’ undeclared (first use in this function)

分析

發現是demo裡使用到的true和flase編譯報錯了,原來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 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

番外

針對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