error: nombre de tipo desconocido 'bool'

86

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?

Meepo
fuente
12
#include <stdbool.h>
leppie

Respuestas:

146

C90 no admite el tipo de datos booleanos.

C99 lo incluye con esto incluyen:

#include <stdbool.h>
user978122
fuente
48
C99 lo hace, si es así #include <stdbool.h>.
Keith Thompson
1
C99 tiene un tipo booleano nativo llamado _Bool. El <stdbool.h>encabezado proporciona un typedef para su nombre bool, junto con truey false.
MM
1
¿cómo es que puedo compilar bien mis cosas bool en OSX sin incluir stdbool.h?
David 天宇 Wong
También he copiado y pegado algo de código "C" y, como respondí, tuve que incluir stbool.h así gcccompilado. Sin embargo, parece que C ++ conoce los valores booleanos "fuera de la caja", por lo que podría usarlos simplemente g++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 ++.
nuala
55

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 booltipo, por lo que la vinculación con bibliotecas externas que se compilaron con una definición adecuada boolpuede causar errores de tiempo de ejecución difíciles de diagnosticar).

Thomas
fuente
39
Mi forma favorita de definir booles:typedef enum { false, true } bool;
Keith Thompson
2
Necesita typedefpoder hacer referencia al tipo como en boollugar de enum bool.
Keith Thompson
3
La última forma es intrínsecamente riesgosa porque no hay conversión implícita. Por ejemplo, si tuviéramos entradas de 16 bits y long FLAG = 0x4000000; bool b = ( x & FLAG );luego esto causa un comportamiento indefinido (con el resultado probable que bparecerá falso incluso si se xhubiera establecido la bandera). Esto es más difícil de detectar cuando booles un parámetro de función. Úselo, pero use con cuidado.
MM
6
¡Tener cuidado! Esto 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 esto typedefadmite tantos como lo inthace, pero también porque C99 booltiene reglas de conversión especiales que typedefno tiene. Ejemplo: en C99, (bool)99999998430674944es inequívoco true. Con su typedef, compilar en GCC en mi máquina, (bool)99999998430674944es false(debido a cómo se maneja el desbordamiento cuando se lanza).
Mark Amery
1
@KeithThompson Una definición como esta rompe ABI si intenta vincular con una biblioteca externa que se compiló con bool normal.
yugr
5

Solo agregue lo siguiente:

#define __USE_C99_MATH

#include <stdbool.h>
M.Hefny
fuente
2
¿Qué es __USE_C99_MATH?
Keith Thompson
4

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 usar g++es mejor que gcc.

Para la biblioteca que falta: debe buscar en el sistema de archivos si puede encontrar un archivo llamado libl.so. Utilice el locatecomando, tratar /usr/lib, /usr/local/lib, /opt/flex/lib, o utilizar la fuerza bruta find / | grep /libl.

Una vez que haya encontrado el archivo, debe agregar el directorio a la línea de comandos del compilador, por ejemplo:

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