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?
#include <stdbool.h>
Respostas:
C90 não suporta o tipo de dados booleano.
C99 inclui com este incluem:
#include <stdbool.h>
fonte
#include <stdbool.h>
._Bool
. O<stdbool.h>
cabeçalho fornece um typedef para ele chamadobool
, junto comtrue
efalse
.gcc
compilado. 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 ++.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
bool
tipo, portanto, vincular a bibliotecas externas que foram compiladas com as definidas corretamentebool
pode causar erros de tempo de execução difíceis de diagnosticar).fonte
bool
é:typedef enum { false, true } bool;
typedef
ser capaz de se referir ao tipo como embool
vez deenum bool
.long FLAG = 0x4000000; bool b = ( x & FLAG );
isso causasse um comportamento indefinido (com o resultado provável queb
pareceria falso mesmo sex
o sinalizador estivesse definido). Isso é mais difícil de detectar quandobool
é um parâmetro de função. Use, mas use com cuidado.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, mastypedef
suporta tantos quantoint
ele, mas também porque C99bool
tem regras de conversão especiais quetypedef
não têm. Exemplo: em C99,(bool)99999998430674944
é inequívocotrue
. Com o seutypedef
, compilar em GCC na minha máquina(bool)99999998430674944
éfalse
(devido a como o estouro é tratado durante a conversão).Basta adicionar o seguinte:
#define __USE_C99_MATH #include <stdbool.h>
fonte
__USE_C99_MATH
?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, usarg++
é melhor do quegcc
.Para a biblioteca ausente: você deve procurar no sistema de arquivos se puder encontrar um arquivo chamado
libl.so
. Use olocate
comando, tente/usr/lib
,/usr/local/lib
,/opt/flex/lib
, ou usar a força-brutafind / | grep /libl
.Depois de encontrar o arquivo, você deve adicionar o diretório à linha de comando do compilador, por exemplo:
fonte