Fehler: unbekannter Typname 'bool'

86

Ich habe den Quellcode heruntergeladen und wollte die Scannerdatei kompilieren. Es erzeugt diesen Fehler:

[meepo@localhost cs143-pp1]$ gcc -o lex.yy.o lex.yy.c -ll
In file included from scanner.l:15:0:
scanner.h:59:5: error: unknown type name ‘bool’
In file included from scanner.l:16:0:
utility.h:64:38: error: unknown type name ‘bool’
utility.h:74:1: error: unknown type name ‘bool’
In file included from scanner.l:17:0:
errors.h:16:18: fatal error: string: No such file or directory
compilation terminated.

Und ich habe versucht, einen anderen Complier zum Kompilieren zu verwenden, aber es erschienen verschiedene Fehler.

[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status

Mein Betriebssystem ist 3.0-ARCH, ich weiß nicht, warum das passiert ist. Wie behebe ich den Fehler?

Meepo
quelle
12
#include <stdbool.h>
Leppie

Antworten:

144

C90 unterstützt den booleschen Datentyp nicht.

C99 enthält es mit diesem Include:

#include <stdbool.h>
user978122
quelle
48
C99 tut es, wenn Sie haben #include <stdbool.h>.
Keith Thompson
1
C99 hat einen nativen booleschen Typ namens _Bool. Der <stdbool.h>Header enthält ein typedef bool, das zusammen mit trueund aufgerufen wird false.
MM
1
Wie kommt es, dass ich meine Bool-Inhalte unter OSX gut kompilieren kann, ohne stdbool.h einzuschließen?
David 天宇 Wong
Ich habe auch etwas "C" -Code kopiert und wie beantwortet musste stbool.h so gcckompiliert enthalten. Es scheint jedoch, dass C ++ Boolesche Werte "out of the box" kennt, sodass ich sie einfach g++zum Kompilieren verwenden kann, ohne den Code zu ändern. Abhängig von Ihrem Kontext, der Codequelle und weiteren Fehlern sehen Sie möglicherweise nicht c, sondern c ++ - Code.
Nuala
55

C99 tut es, wenn Sie haben

#include <stdbool.h> 

Wenn der Compiler C99 nicht unterstützt, können Sie es selbst definieren:

// file : myboolean.h
#ifndef MYBOOLEAN_H
#define MYBOOLEAN_H

#define false 0
#define true 1
typedef int bool; // or #define bool int

#endif

(Beachten Sie jedoch, dass diese Definition den ABI für den boolTyp ändert, sodass die Verknüpfung mit externen Bibliotheken, die mit ordnungsgemäß definierten Bibliotheken kompiliert wurden, zu boolschwer zu diagnostizierenden Laufzeitfehlern führen kann.)

Thomas
quelle
39
Meine eigene Lieblingsdefinition boolist:typedef enum { false, true } bool;
Keith Thompson
2
Sie benötigen die typedef, um auf den Typ als boolund nicht verweisen zu können enum bool.
Keith Thompson
3
Der letztere Weg ist von Natur aus riskant, da keine implizite Konvertierung erfolgt. Zum Beispiel, wenn wir 16-Bit-Ints hatten und dies long FLAG = 0x4000000; bool b = ( x & FLAG );dann zu undefiniertem Verhalten führt (mit dem wahrscheinlichen Ergebnis, dass bes falsch erscheint, selbst wenn xdas Flag gesetzt ist). Dies ist schwerer zu erkennen, wenn booles sich um einen Funktionsparameter handelt. Verwenden Sie, aber verwenden Sie mit Vorsicht.
MM
6
In acht nehmen! Dies verhält sich in Edge-Fällen typedef nicht wie ein echter C99-Bool, sowohl weil ein echter C99-Bool nur zwei Werte hat, dies jedoch typedefso viele intunterstützt, als auch, weil C99 boolspezielle Casting-Regeln hat, die typedefdies nicht tut. Beispiel: in C99 (bool)99999998430674944ist eindeutig true. Mit Ihrer typedef, in GCC auf meinem Computer zu kompilieren, (bool)99999998430674944ist false(aufgrund, wie Überlauf beim Casting behandelt wird).
Mark Amery
1
@KeithThompson Eine Definition wie diese unterbricht ABI, wenn Sie versuchen, eine Verknüpfung mit einer externen Bibliothek herzustellen, die mit normalem Bool kompiliert wurde.
yugr
4

Irgendwo in Ihrem Code befindet sich eine Zeile #include <string>. Dies allein sagt Ihnen, dass das Programm in C ++ geschrieben ist. Verwenden g++ist also besser als gcc.

Für die fehlende Bibliothek: Sie sollten sich im Dateisystem umsehen, wenn Sie eine Datei mit dem Namen finden libl.so. Verwenden Sie den locateBefehl, versuchen Sie /usr/lib, /usr/local/lib, /opt/flex/liboder die Brute-Force verwenden find / | grep /libl.

Sobald Sie die Datei gefunden haben, müssen Sie das Verzeichnis zur Compiler-Befehlszeile hinzufügen, zum Beispiel:

g++ -o scan lex.yy.c -L/opt/flex/lib -ll
Roland Illig
quelle
4

Fügen Sie einfach Folgendes hinzu:

#define __USE_C99_MATH

#include <stdbool.h>
M.Hefny
quelle
2
Was ist __USE_C99_MATH?
Keith Thompson