erro: nome de tipo desconhecido 'bool'

86

Baixei o código fonte e queria compilar o arquivo do scanner. Ele produz este erro:

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

E tentei usar um compilador diferente para compilá-lo, mas apareceram erros diferentes.

[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status

Meu sistema operacional é 3.0-ARCH, não sei por que isso aconteceu. Como faço para corrigir o erro?

Meepo
fonte
12
#include <stdbool.h>
leppie de

Respostas:

146

C90 não suporta o tipo de dados booleano.

C99 inclui com este incluem:

#include <stdbool.h>
user978122
fonte
48
C99 sim, se você tiver #include <stdbool.h>.
Keith Thompson de
1
C99 tem um tipo booleano nativo chamado _Bool. O <stdbool.h>cabeçalho fornece um typedef para ele chamado bool, junto com truee false.
MM de
1
como posso compilar minhas coisas bool bem no OSX sem incluir stdbool.h?
David 天宇 Wong
Também copiei e colei algum código "C" e, como respondi, tive que incluir o stbool.h assim gcccompilado. No entanto, parece que C ++ conhece booleanos "fora da caixa", então eu poderia simplesmente usá g++-los para compilar sem quaisquer alterações no código. Portanto, dependendo do seu contexto, fonte de código e outros erros, talvez você não esteja olhando para código c, mas c ++.
nuala
55

C99 sim, se você tiver

#include <stdbool.h> 

Se o compilador não suportar C99, você mesmo pode defini-lo:

// file : myboolean.h
#ifndef MYBOOLEAN_H
#define MYBOOLEAN_H

#define false 0
#define true 1
typedef int bool; // or #define bool int

#endif

(mas observe que esta definição altera a ABI para o booltipo, portanto, vincular a bibliotecas externas que foram compiladas com as definidas corretamente boolpode causar erros de tempo de execução difíceis de diagnosticar).

Thomas
fonte
39
Minha maneira favorita de definir boolé:typedef enum { false, true } bool;
Keith Thompson
2
Você precisa typedefser capaz de se referir ao tipo como em boolvez de enum bool.
Keith Thompson
3
A última forma é inerentemente arriscada porque não há conversão implícita. Por exemplo, se tivéssemos ints de 16 bits e long FLAG = 0x4000000; bool b = ( x & FLAG );isso causasse um comportamento indefinido (com o resultado provável que bpareceria falso mesmo se xo sinalizador estivesse definido). Isso é mais difícil de detectar quando boolé um parâmetro de função. Use, mas use com cuidado.
MM de
6
Cuidado! Isso typedef não se comportará da mesma forma que um bool C99 verdadeiro em casos extremos, tanto porque um bool C99 verdadeiro tem apenas dois valores, mas typedefsuporta tantos quanto intele, mas também porque C99 booltem regras de conversão especiais que typedefnão têm. Exemplo: em C99, (bool)99999998430674944é inequívoco true. Com o seu typedef, compilar em GCC na minha máquina (bool)99999998430674944é false(devido a como o estouro é tratado durante a conversão).
Mark Amery,
1
@KeithThompson Uma definição como esta quebra o ABI se você tentar fazer um link com uma biblioteca externa que foi compilada com o bool normal.
yugr
5

Basta adicionar o seguinte:

#define __USE_C99_MATH

#include <stdbool.h>
M.Hefny
fonte
2
O que é __USE_C99_MATH?
Keith Thompson
4

Em algum lugar do seu código existe uma linha #include <string>. Isso por si só indica que o programa foi escrito em C ++. Portanto, usar g++é melhor do que gcc.

Para a biblioteca ausente: você deve procurar no sistema de arquivos se puder encontrar um arquivo chamado libl.so. Use o locatecomando, tente /usr/lib, /usr/local/lib, /opt/flex/lib, ou usar a força-bruta find / | grep /libl.

Depois de encontrar o arquivo, você deve adicionar o diretório à linha de comando do compilador, por exemplo:

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