помилка: невідома назва типу '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, я не знаю, чому це сталося. Як виправити помилку?


12
#include <stdbool.h>
леппі

Відповіді:


146

C90 не підтримує логічний тип даних.

C99 включає його, включаючи:

#include <stdbool.h>

48
C99, якщо у вас є #include <stdbool.h>.
Кіт Томпсон,

1
C99 має власний булевий тип _Bool. <stdbool.h>Тема забезпечує ЬурейеЕ для нього назви bool, поряд з trueі false.
MM

1
як так, що я можу скомпілювати свої файли bool на OSX без включення stdbool.h?
Девід 天宇 Вонг,

Я також скопіював деякий код "С", і у відповідь повинен був включити так gccскомпільований stbool.h . Однак, схоже, C ++ знає логічні значення "нестандартно", тому я міг просто використовувати g++для компіляції без будь-яких змін у коді. Отже, залежно від вашого контексту, джерела коду та подальших помилок, можливо, ви дивитесь не на c, а на код c ++.
нуала,

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-розрядні ints, і long FLAG = 0x4000000; bool b = ( x & FLAG );це спричиняє невизначену поведінку (з імовірним результатом, який bбуде видаватися хибним, навіть якщо xвстановлений прапор). Це важче помітити, коли boolпараметр функції є. Використовуйте, але використовуйте обережно.
MM

6
Обережно! Це typedef не буде поводитися так само, як справжній bool C99 у крайніх випадках, і тому, що справжній bool C99 має лише два значення, але це typedefпідтримує стільки intж, скільки це можливо, а також тому, що C99 boolмає спеціальні правила відливання, яких typedefнемає. Приклад: в C99 (bool)99999998430674944- однозначно true. З вашим typedef, компіляція в GCC на моїй машині, (bool)99999998430674944є false(завдяки тому, як обробляється переповнення під час лиття).
Mark Amery

1
@KeithThompson Визначення, подібне до цього, порушує ABI, якщо ви намагаєтеся зв’язати із зовнішньою бібліотекою, яка була скомпільована із звичайним bool.
югр


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.