Fehler: unbekannter Typname „bool“

Lesezeit: 4 Minuten

Benutzeravatar von Meepo
Meepo

Ich habe den Quellcode heruntergeladen und wollte die Datei des Scanners 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 Compiler zu verwenden, um es zu kompilieren, aber es sind verschiedene Fehler aufgetreten.

[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>

    – lepi

    15. November 2011 um 7:54 Uhr

Benutzeravatar von user978122
Benutzer978122

C90 unterstützt den booleschen Datentyp nicht.

C99 schließt es mit ein:

#include <stdbool.h>

  • C99 tut es, wenn Sie haben #include <stdbool.h>.

    – Keith Thompson

    15. November 2011 um 8:37 Uhr

  • C99 hat einen nativen booleschen Typ namens _Bool. Das <stdbool.h> Header stellt eine Typedef dafür bereit, die aufgerufen wird boolzusammen mit true und false.

    – MM

    1. April 2015 um 3:59 Uhr

  • Wie kommt es, dass ich mein bool-Zeug unter OSX ohne stdbool.h kompilieren kann?

    – David 天宇 Wong

    17. November 2018 um 18:58 Uhr

  • Ich habe auch etwas “C” -Code kopiert und eingefügt, und als Antwort musste stbool.h so eingefügt werden gcc zusammengestellt. Allerdings scheint C++ Booleans “out of the box” zu kennen, also könnte ich einfach verwenden g++ zum Kompilieren ohne Änderungen am Code. Abhängig von Ihrem Kontext, Ihrer Codequelle und weiteren Fehlern sehen Sie sich also möglicherweise nicht C, sondern C ++ – Code an.

    – Nuala

    26. September 2019 um 15:33 Uhr


Benutzeravatar von Thomas
Thomas

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

(aber beachten Sie, dass sich diese Definition ändert ABI zum bool Geben Sie so das Verlinken gegen externe Bibliotheken ein, die mit richtig definierten kompiliert wurden bool kann schwer zu diagnostizierende Laufzeitfehler verursachen).

  • Meine eigene Lieblingsart zu definieren bool ist: typedef enum { false, true } bool;

    – Keith Thompson

    17. November 2011 um 3:27 Uhr

  • Du brauchst die typedef um auf den Typ verweisen zu können als bool statt enum bool.

    – Keith Thompson

    17. November 2011 um 3:48 Uhr

  • Der letztere Weg ist von Natur aus riskant, da es keine implizite Konvertierung gibt. Wenn wir zum Beispiel 16-Bit-Ints und hätten long FLAG = 0x4000000; bool b = ( x & FLAG ); dann führt dies zu undefiniertem Verhalten (mit dem wahrscheinlichen Ergebnis, dass b wird als falsch erscheinen, selbst wenn x hatte die Flagge gesetzt). Dies ist schwieriger zu erkennen, wenn die bool ist ein Funktionsparameter. Verwenden Sie es, aber verwenden Sie es mit Vorsicht.

    – MM

    1. April 2015 um 4:01 Uhr


  • In acht nehmen! Dies typedef Gewohnheit verhalten sich in Randfällen genauso wie ein echter C99-Bool, beides, weil ein echter C99-Bool nur zwei Werte außer diesem hat typedef unterstützt so viele wie int tut, sondern auch weil C99 bool hat spezielle Wurfregeln, die die typedef nicht. Beispiel: in C99, (bool)99999998430674944 ist eindeutig true. Mit Ihrer typedefKompilieren in GCC auf meiner Maschine, (bool)99999998430674944 ist false (aufgrund der Handhabung des Überlaufs beim Gießen).

    – Mark Amery

    3. April 2016 um 18:08 Uhr


  • @KeithThompson Eine solche Definition unterbricht ABI, wenn Sie versuchen, eine Verknüpfung mit einer externen Bibliothek herzustellen, die mit normalem Bool kompiliert wurde.

    – jugr

    21. April 2018 um 19:04 Uhr


Benutzeravatar von M.Hefny
M.Hefny

Fügen Sie einfach Folgendes hinzu:

#define __USE_C99_MATH

#include <stdbool.h>

  • Was ist __USE_C99_MATH?

    – Keith Thompson

    22. April 2018 um 20:37 Uhr

Irgendwo in deinem Code gibt es eine Zeile #include <string>. Dies allein sagt Ihnen, dass das Programm in C++ geschrieben ist. Also verwenden g++ ist 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 die locate Befehl, versuchen /usr/lib, /usr/local/lib, /opt/flex/liboder verwenden Sie die Brute-Force find / | grep /libl.

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

g++ -o scan lex.yy.c -L/opt/flex/lib -ll

1422340cookie-checkFehler: unbekannter Typname „bool“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy