errore: nome del tipo sconosciuto "bool"


88

Ho scaricato il codice sorgente e volevo compilare il file dello scanner. Produce questo errore:

E ho provato a utilizzare un compilatore diverso per compilarlo, ma sono apparsi errori diversi.

Il mio sistema operativo è 3.0-ARCH, non so perché sia ​​successo. Come correggo l'errore?


12
#include <stdbool.h>
leppie

Risposte:


152

C90 non supporta il tipo di dati booleano.

C99 lo include con questo include:


48
C99 sì, se lo hai #include <stdbool.h>.
Keith Thompson

1
C99 ha un tipo booleano nativo chiamato _Bool. L' <stdbool.h>intestazione fornisce un typedef per esso chiamato bool, insieme a truee false.
MM

1
come mai posso compilare la mia roba bool bene su OSX senza includere stdbool.h?
David 天宇 Wong

Ho copiato e incollato anche del codice "C" e come risposta ho dovuto includere stbool.h così gcccompilato. Tuttavia sembra che il C ++ conosca i booleani "out of the box" quindi potrei semplicemente usarli g++per la compilazione senza alcuna modifica al codice. Quindi, a seconda del contesto, della fonte del codice e di ulteriori errori, forse non stai guardando il codice c ma c ++.
nuala

55

C99 sì, se lo hai

Se il compilatore non supporta C99, puoi definirlo tu stesso:

(ma si noti che questa definizione cambia l' ABI per il booltipo, quindi il collegamento a librerie esterne che sono state compilate con una definizione appropriata boolpuò causare errori di runtime difficili da diagnosticare).


39
Il mio modo preferito per definire boolè:typedef enum { false, true } bool;
Keith Thompson

2
È necessario typedefper poter fare riferimento al tipo come boolanziché enum bool.
Keith Thompson

3
Quest'ultimo modo è intrinsecamente rischioso perché non c'è conversione implicita. Ad esempio, se avessimo int a 16 bit e long FLAG = 0x4000000; bool b = ( x & FLAG );questo causa un comportamento indefinito (con il probabile risultato che bsembrerà falso anche se xfosse impostato il flag). Questo è più difficile da individuare quando boolè un parametro di funzione. Usa, ma usa con attenzione.
MM

6
Attenti! Questo typedef non si comporterà come un vero bool C99 nei casi limite, sia perché un vero bool C99 ha solo due valori ma questo ne typedefsupporta tanti quanti ne supporta int, ma anche perché C99 boolha regole di casting speciali che typedefnon lo fanno. Esempio: in C99, (bool)99999998430674944è inequivocabile true. Con il tuo typedef, la compilazione in GCC sulla mia macchina, (bool)99999998430674944è false(a causa di come viene gestito l'overflow durante il casting).
Mark Amery

1
@KeithThompson Una definizione come questa interrompe l'ABI se si tenta di collegarsi a una libreria esterna compilata con bool normale.
yugr


4

Da qualche parte nel tuo codice c'è una riga #include <string>. Questo da solo ti dice che il programma è scritto in C ++. Quindi usare g++è meglio di gcc.

Per la libreria mancante: dovresti guardarti intorno nel file system se riesci a trovare un file chiamato libl.so. Utilizzare il locatecomando provare /usr/lib, /usr/local/lib, /opt/flex/lib, o utilizzare la forza bruta find / | grep /libl.

Una volta trovato il file, devi aggiungere la directory alla riga di comando del compilatore, ad esempio:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.