Descargué el código fuente y quería compilar el archivo del escáner. Produce este error:
[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 intenté usar un compilador diferente para compilarlo, pero aparecieron errores diferentes.
[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status
Mi sistema operativo es 3.0-ARCH, no sé por qué sucedió esto. ¿Cómo soluciono el error?
#include <stdbool.h>
Respuestas:
C90 no admite el tipo de datos booleanos.
C99 lo incluye con esto incluyen:
#include <stdbool.h>
fuente
#include <stdbool.h>
._Bool
. El<stdbool.h>
encabezado proporciona un typedef para su nombrebool
, junto contrue
yfalse
.gcc
compilado. Sin embargo, parece que C ++ conoce los valores booleanos "fuera de la caja", por lo que podría usarlos simplementeg++
para compilar sin ningún cambio en el código. Entonces, dependiendo de su contexto, fuente de código y otros errores, tal vez no esté viendo el código c sino el código c ++.C99 lo hace, si tiene
#include <stdbool.h>
Si el compilador no es compatible con C99, puede definirlo usted mismo:
// file : myboolean.h #ifndef MYBOOLEAN_H #define MYBOOLEAN_H #define false 0 #define true 1 typedef int bool; // or #define bool int #endif
(pero tenga en cuenta que esta definición cambia ABI para el
bool
tipo, por lo que la vinculación con bibliotecas externas que se compilaron con una definición adecuadabool
puede causar errores de tiempo de ejecución difíciles de diagnosticar).fuente
bool
es:typedef enum { false, true } bool;
typedef
poder hacer referencia al tipo como enbool
lugar deenum bool
.long FLAG = 0x4000000; bool b = ( x & FLAG );
luego esto causa un comportamiento indefinido (con el resultado probable queb
parecerá falso incluso si sex
hubiera establecido la bandera). Esto es más difícil de detectar cuandobool
es un parámetro de función. Úselo, pero use con cuidado.typedef
no se comportará de la misma manera que un bool C99 verdadero en casos extremos, tanto porque un bool C99 verdadero tiene solo dos valores, pero estotypedef
admite tantos como loint
hace, pero también porque C99bool
tiene reglas de conversión especiales quetypedef
no tiene. Ejemplo: en C99,(bool)99999998430674944
es inequívocotrue
. Con sutypedef
, compilar en GCC en mi máquina,(bool)99999998430674944
esfalse
(debido a cómo se maneja el desbordamiento cuando se lanza).Solo agregue lo siguiente:
#define __USE_C99_MATH #include <stdbool.h>
fuente
__USE_C99_MATH
?En algún lugar de su código hay una línea
#include <string>
. Esto por sí solo le dice que el programa está escrito en C ++. Entonces usarg++
es mejor quegcc
.Para la biblioteca que falta: debe buscar en el sistema de archivos si puede encontrar un archivo llamado
libl.so
. Utilice ellocate
comando, tratar/usr/lib
,/usr/local/lib
,/opt/flex/lib
, o utilizar la fuerza brutafind / | grep /libl
.Una vez que haya encontrado el archivo, debe agregar el directorio a la línea de comandos del compilador, por ejemplo:
fuente