Я скачал исходный код и хотел скомпилировать файл сканера. Это вызывает эту ошибку:
[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.
И я пытался использовать другой компилятор для его компиляции, но появлялись разные ошибки.
[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status
У меня ОС 3.0-ARCH, я не знаю, почему это произошло. Как исправить ошибку?
#include <stdbool.h>
Ответы:
C90 не поддерживает логический тип данных.
C99 включает в себя:
#include <stdbool.h>
источник
#include <stdbool.h>
._Bool
.<stdbool.h>
Заголовок обеспечивает ЬурейиЙ для него названияbool
, наряду сtrue
иfalse
.gcc
скомпилированный таким образом . Однако, похоже, C ++ знает логические значения «из коробки», поэтому я мог просто использовать ихg++
для компиляции без каких-либо изменений в коде. Итак, в зависимости от вашего контекста, источника кода и других ошибок, возможно, вы смотрите не на c, а на код c ++.C99 делает, если у вас есть
#include <stdbool.h>
Если компилятор не поддерживает C99, вы можете определить его самостоятельно:
// file : myboolean.h #ifndef MYBOOLEAN_H #define MYBOOLEAN_H #define false 0 #define true 1 typedef int bool; // or #define bool int #endif
(но обратите внимание, что это определение изменяет ABI для
bool
типа, поэтому связывание с внешними библиотеками, которые были скомпилированы с правильно определенными,bool
может вызвать трудно диагностируемые ошибки времени выполнения).источник
bool
:typedef enum { false, true } bool;
typedef
чтобы иметь возможность обратиться к типу,bool
а неenum bool
.long FLAG = 0x4000000; bool b = ( x & FLAG );
тогда это вызывает неопределенное поведение (с вероятным результатом,b
который окажется ложным, даже еслиx
был установлен флаг). Это труднее обнаружить, если параметрbool
является функцией. Используйте, но используйте с осторожностью.typedef
не будет вести себя так же, как истинный C99 bool в крайних случаях, потому что истинный C99 bool имеет только два значения, но онtypedef
поддерживает столько же, сколькоint
есть, но также потому, что C99bool
имеет специальные правила приведения типов, которыхtypedef
нет. Пример: в C99,(bool)99999998430674944
однозначноtrue
. С вашейtypedef
компиляцией в GCC на моей машине(bool)99999998430674944
естьfalse
(из-за того, как переполнение обрабатывается при литье).Просто добавьте следующее:
#define __USE_C99_MATH #include <stdbool.h>
источник
__USE_C99_MATH
?Где-то в вашем коде есть строчка
#include <string>
. Это само по себе говорит о том, что программа написана на C ++. Такg++
что лучше использоватьgcc
.Для отсутствующей библиотеки: вам следует поискать в файловой системе, если вы можете найти файл с именем
libl.so
. Используйтеlocate
команду, попробуйте/usr/lib
,/usr/local/lib
,/opt/flex/lib
или использовать грубую силуfind / | grep /libl
.После того, как вы нашли файл, вам нужно добавить каталог в командную строку компилятора, например:
источник