ข้อผิดพลาด: ไม่ทราบชื่อประเภท 'bool'


88

ฉันดาวน์โหลดซอร์สโค้ดและต้องการรวบรวมไฟล์สแกนเนอร์ มันทำให้เกิดข้อผิดพลาดนี้:

และฉันพยายามใช้คอมไพล์ที่แตกต่างกัน แต่มันมีข้อผิดพลาดที่แตกต่างกัน

ระบบปฏิบัติการของฉันคือ 3.0-ARCH ฉันไม่รู้ว่าทำไมถึงเกิดขึ้น ฉันจะแก้ไขข้อผิดพลาดได้อย่างไร


12
#include <stdbool.h>
leppie

คำตอบ:


151

C90 ไม่รองรับชนิดข้อมูลบูลีน

C99 รวมไว้ด้วย:


48
C99 ทำถ้าคุณมี#include <stdbool.h>.
Keith Thompson

1
C99 มีประเภทบูลีนดั้งเดิมที่เรียกว่า_Bool. <stdbool.h>ส่วนหัวให้ typedef มันเรียกว่าboolพร้อมกับและtrue false
MM

1
ฉันจะรวบรวมสิ่งที่บูลของฉันได้ดีบน OSX โดยไม่รวม stdbool.h ได้อย่างไร
David 天宇 Wong

ฉันคัดลอกและวางโค้ด "C" บางส่วนแล้วและตามที่ได้รับคำตอบต้องรวม stbool.h ที่gccคอมไพล์ด้วย อย่างไรก็ตามดูเหมือนว่า C ++ จะรู้บูลีน "นอกกรอบ" ดังนั้นฉันจึงสามารถใช้g++สำหรับการคอมไพล์โดยไม่มีการเปลี่ยนแปลงโค้ด ดังนั้นขึ้นอยู่กับบริบทของคุณซอร์สโค้ดและข้อผิดพลาดเพิ่มเติมบางทีคุณอาจไม่ได้ดูที่ c แต่เป็นโค้ด c ++
Nuala

55

C99 ทำถ้าคุณมี

หากคอมไพเลอร์ไม่รองรับ C99 คุณสามารถกำหนดได้เอง:

(แต่โปรดทราบว่าคำจำกัดความนี้เปลี่ยนABIสำหรับboolประเภทดังนั้นการเชื่อมโยงกับไลบรารีภายนอกที่คอมไพล์ด้วยการกำหนดอย่างถูกต้องboolอาจทำให้เกิดข้อผิดพลาดรันไทม์ที่ยากต่อการวินิจฉัย)


39
วิธีที่ฉันชอบในการกำหนดboolคือ:typedef enum { false, true } bool;
Keith Thompson

2
คุณจำเป็นต้องมีtypedefเพื่อให้สามารถที่จะอ้างถึงชนิดเป็นมากกว่าbool enum bool
Keith Thompson

3
วิธีหลังมีความเสี่ยงโดยเนื้อแท้เนื่องจากไม่มีการแปลงโดยปริยาย ตัวอย่างเช่นถ้าเรามี ints 16 บิตlong FLAG = 0x4000000; bool b = ( x & FLAG );แล้วสิ่งนี้จะทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด (ด้วยผลลัพธ์ที่เป็นไปได้ที่bจะดูเหมือนเป็นเท็จแม้ว่าจะxมีการตั้งค่าแฟล็กก็ตาม) สิ่งนี้ยากที่จะมองเห็นเมื่อboolพารามิเตอร์เป็นฟังก์ชัน ใช้ แต่ใช้ด้วยความระมัดระวัง
MM

6
ระวัง! สิ่งนี้typedef จะไม่ทำงานเหมือนกับบูล C99 จริงในกรณี edge ทั้งสองอย่างเนื่องจากบูล C99 ที่แท้จริงมีเพียงสองค่า แต่สิ่งนี้typedefรองรับได้มากพอintๆ กัน แต่ยังเป็นเพราะ C99 boolมีกฎการหล่อแบบพิเศษซึ่งtypedefไม่มี ตัวอย่าง: ใน C99, คือไม่น่าสงสัย(bool)99999998430674944 trueด้วยtypedefการรวบรวมใน GCC บนเครื่องของฉัน(bool)99999998430674944คือfalse(เนื่องจากวิธีการจัดการล้นเมื่อแคสต์)
Mark Amery

1
@KeithThompson คำจำกัดความเช่นนี้จะแบ่ง ABI หากคุณพยายามเชื่อมโยงกับไลบรารีภายนอกซึ่งคอมไพล์ด้วยบูลปกติ
yugr


4

#include <string>ที่ไหนสักแห่งในรหัสของคุณมีบรรทัด สิ่งนี้บอกคุณเองว่าโปรแกรมเขียนด้วย C ++ ดังนั้นการใช้จะดีกว่าg++gcc

สำหรับไลบรารีที่หายไป: คุณควรมองไปรอบ ๆ ในระบบไฟล์หากพบไฟล์ที่เรียกว่าlibl.so. ใช้locateคำสั่งลอง/usr/lib, /usr/local/lib, หรือใช้แรงเดรัจฉาน/opt/flex/libfind / | grep /libl

เมื่อคุณพบไฟล์แล้วคุณต้องเพิ่มไดเร็กทอรีในบรรทัดคำสั่งของคอมไพเลอร์ตัวอย่างเช่น:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.