「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
//
#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