ошибка: неизвестное имя типа 'bool'

86

Я скачал исходный код и хотел скомпилировать файл сканера. Это вызывает эту ошибку:

[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, я не знаю, почему это произошло. Как исправить ошибку?

Meepo
источник
12
#include <stdbool.h>
leppie

Ответы:

146

C90 не поддерживает логический тип данных.

C99 включает в себя:

#include <stdbool.h>
user978122
источник
48
C99 делает, если у вас есть #include <stdbool.h>.
Кейт Томпсон
1
C99 имеет собственный логический тип, называемый _Bool. <stdbool.h>Заголовок обеспечивает ЬурейиЙ для него названия bool, наряду с trueи false.
MM
1
почему я могу хорошо скомпилировать свой bool-материал на OSX без включения stdbool.h?
Дэвид 天宇 Вонг
Я также скопировал код "C" и, как ответил, должен был включить stbool.h, gccскомпилированный таким образом . Однако, похоже, C ++ знает логические значения «из коробки», поэтому я мог просто использовать их g++для компиляции без каких-либо изменений в коде. Итак, в зависимости от вашего контекста, источника кода и других ошибок, возможно, вы смотрите не на c, а на код c ++.
nuala
55

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может вызвать трудно диагностируемые ошибки времени выполнения).

Томас
источник
39
Мой любимый способ дать определение bool:typedef enum { false, true } bool;
Кейт Томпсон
2
Вам необходимо , typedefчтобы иметь возможность обратиться к типу, boolа не enum bool.
Кейт Томпсон
3
Последний способ по своей сути рискован, поскольку не существует неявного преобразования. Например, если у нас есть 16-битные целые числа, и long FLAG = 0x4000000; bool b = ( x & FLAG );тогда это вызывает неопределенное поведение (с вероятным результатом, bкоторый окажется ложным, даже если xбыл установлен флаг). Это труднее обнаружить, если параметр boolявляется функцией. Используйте, но используйте с осторожностью.
MM
6
Осторожно! Это typedef не будет вести себя так же, как истинный C99 bool в крайних случаях, потому что истинный C99 bool имеет только два значения, но он typedefподдерживает столько же, сколько intесть, но также потому, что C99 boolимеет специальные правила приведения типов, которых typedefнет. Пример: в C99, (bool)99999998430674944однозначно true. С вашей typedefкомпиляцией в GCC на моей машине (bool)99999998430674944есть false(из-за того, как переполнение обрабатывается при литье).
Марк Эмери
1
@KeithThompson Определение, подобное этому, нарушает ABI, если вы пытаетесь связать с внешней библиотекой, которая была скомпилирована с помощью обычного bool.
yugr
5

Просто добавьте следующее:

#define __USE_C99_MATH

#include <stdbool.h>
М.Хефни
источник
2
Что есть __USE_C99_MATH?
Кейт Томпсон
4

Где-то в вашем коде есть строчка #include <string>. Это само по себе говорит о том, что программа написана на C ++. Так g++что лучше использовать gcc.

Для отсутствующей библиотеки: вам следует поискать в файловой системе, если вы можете найти файл с именем libl.so. Используйте locateкоманду, попробуйте /usr/lib, /usr/local/lib, /opt/flex/libили использовать грубую силу find / | grep /libl.

После того, как вы нашли файл, вам нужно добавить каталог в командную строку компилятора, например:

g++ -o scan lex.yy.c -L/opt/flex/lib -ll
Роланд Иллиг
источник