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?
#include <stdbool.h>
Antworten:
C90 unterstützt den booleschen Datentyp nicht.
C99 enthält es mit diesem Include:
#include <stdbool.h>
quelle
#include <stdbool.h>
._Bool
. Der<stdbool.h>
Header enthält ein typedefbool
, das zusammen mittrue
und aufgerufen wirdfalse
.gcc
kompiliert enthalten. Es scheint jedoch, dass C ++ Boolesche Werte "out of the box" kennt, sodass ich sie einfachg++
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.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
bool
Typ ändert, sodass die Verknüpfung mit externen Bibliotheken, die mit ordnungsgemäß definierten Bibliotheken kompiliert wurden, zubool
schwer zu diagnostizierenden Laufzeitfehlern führen kann.)quelle
bool
ist:typedef enum { false, true } bool;
typedef
, um auf den Typ alsbool
und nicht verweisen zu könnenenum bool
.long FLAG = 0x4000000; bool b = ( x & FLAG );
dann zu undefiniertem Verhalten führt (mit dem wahrscheinlichen Ergebnis, dassb
es falsch erscheint, selbst wennx
das Flag gesetzt ist). Dies ist schwerer zu erkennen, wennbool
es sich um einen Funktionsparameter handelt. Verwenden Sie, aber verwenden Sie mit Vorsicht.typedef
nicht wie ein echter C99-Bool, sowohl weil ein echter C99-Bool nur zwei Werte hat, dies jedochtypedef
so vieleint
unterstützt, als auch, weil C99bool
spezielle Casting-Regeln hat, dietypedef
dies nicht tut. Beispiel: in C99(bool)99999998430674944
ist eindeutigtrue
. Mit Ihrertypedef
, in GCC auf meinem Computer zu kompilieren,(bool)99999998430674944
istfalse
(aufgrund, wie Überlauf beim Casting behandelt wird).Irgendwo in Ihrem Code befindet sich eine Zeile
#include <string>
. Dies allein sagt Ihnen, dass das Programm in C ++ geschrieben ist. Verwendeng++
ist also besser alsgcc
.Für die fehlende Bibliothek: Sie sollten sich im Dateisystem umsehen, wenn Sie eine Datei mit dem Namen finden
libl.so
. Verwenden Sie denlocate
Befehl, versuchen Sie/usr/lib
,/usr/local/lib
,/opt/flex/lib
oder die Brute-Force verwendenfind / | grep /libl
.Sobald Sie die Datei gefunden haben, müssen Sie das Verzeichnis zur Compiler-Befehlszeile hinzufügen, zum Beispiel:
quelle
Fügen Sie einfach Folgendes hinzu:
#define __USE_C99_MATH #include <stdbool.h>
quelle
__USE_C99_MATH
?