解決gcc編譯報錯unknown type name ‘bool‘問題
gcc編譯報錯unknown type name ‘bool‘
錯誤描述
unknown type name ‘bool’
最近使用C實現(xiàn)數(shù)據(jù)結(jié)構(gòu)碰到了以下這個錯誤
? ?LinkedList gcc list.c? list.c:14:1: error: unknown type name ‘bool'; did you mean ‘_Bool'? ?bool is_empty(PNODE pHead); ?^~~~ ?_Bool list.c:77:1: error: unknown type name ‘bool'; did you mean ‘_Bool'? ?bool is_empty(PNODE pHead) ?^~~~ ?_Bool list.c: In function ‘is_empty': list.c:80:9: error: ‘true' undeclared (first use in this function); did you mean ‘free'? ? return true; ? ? ? ? ?^~~~ ? ? ? ? ?free list.c:80:9: note: each undeclared identifier is reported only once for each function it appears in list.c:82:9: error: ‘false' undeclared (first use in this function); did you mean ‘fclose'? ? return false; ? ? ? ? ?^~~~~
錯誤原因
未知的類型名:‘bool’, 因為在C語言標準(C89)沒有定義布爾類型,所以會報錯。
而C99提供了一個頭文件<stdbool.h>定義了bool,true代表1,false代表0。
只要導(dǎo)入stdbool.h,就能非常方便的操作布爾類型了。
解決方法
#include <stdbool.h>
gcc和g++編譯c或者c++文件碰到的問題
gcc 和 g++ 都是 GNU (組織) 的一個編譯器。
誤區(qū)一:gcc只能編譯c代碼,g++只能編譯c++代碼
兩者都可以,但是請注意:
1. 后綴為.c 的,gcc 把它當(dāng)作是 C 程序,而 g++ 當(dāng)作是 c++ 程序;后綴為.cpp 的,兩者都會認為是 c++ 程序,注意,雖然 c++ 是 c 的超集,但是兩者對語法的要求是有區(qū)別的。C++ 的語法規(guī)則更加嚴謹一些。
2. 編譯階段,g++ 會調(diào)用 gcc,對于 c++ 代碼,兩者是等價的,但是因為 gcc 命令不能自動和 C++程序使用的庫聯(lián)接,所以通常用 g++ 來完成鏈接,為了統(tǒng)一起見,干脆編譯 / 鏈接統(tǒng)統(tǒng)用 g++ 了,這就給人一種錯覺,好像 cpp 程序只能用 g++ 似的。
誤區(qū)二:gcc不會定義__cplusplus宏,而g++會
實際上,這個宏只是標志著編譯器將會把代碼按 C 還是 C++ 語法來解釋,如上所述,如果后綴為.c,并且采用 gcc 編譯器,則該宏就是未定義的,否則,就是已定義。
誤區(qū)三:編譯只能用gcc,鏈接只能用g++
嚴格來說,這句話不算錯誤,但是它混淆了概念,應(yīng)該這樣說:編譯可以用 gcc/g++,而鏈接可以用 g++ 或者 gcc
-lstdc++。因為 gcc 命令不能自動和 C++程序使用的庫聯(lián)接,所以通常使用 g++ 來完成聯(lián)接。但在編譯階段,g++ 會自動調(diào)用 gcc,二者等價。
用 gcc 編譯 c++ 文件:
#gcc -o test.exe test.cpp -lstdc++
用 GCC 編譯 c++ 文件時,必須加上 - lstdc++ 的參數(shù)選項,告訴編譯器自動調(diào)用 g++ 編譯器來自動鏈接 C++ 里面的庫函數(shù),否側(cè),生成的可執(zhí)行文件不能運行成功。
問題 2
for(int i = 0; i < 100; i++)
{
? ? ?.............
}使用 gcc 直接編譯報錯,因為 C99 規(guī)定,變量必須事先定義好,不能使用時再定義,但是這種定義變量的方式在 C++ 中合法
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++中std::construct()與std::destroy()的使用
std::construct()和std::destroy()是C++ STL中的函數(shù)模板,用于在已分配的存儲區(qū)域中構(gòu)造或銷毀對象,本文主要介紹了C++中std::construct()與std::destroy()的使用,感興趣的可以了解一下2024-02-02

