Así que tengo problemas con un código que he heredado. Este código se estaba compilando bien en un entorno de solo C, pero ahora necesito usar C++ para llamar a este código. el encabezado problem.h
contiene:
#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
struct astruct
{
bool myvar;
/* and a bunch more */
}
Cuando lo compilo como código C++, obtengo error C2632: 'char' followed by 'bool' is illegal
Recibo el mismo error si envuelvo el #include "problem.h"
en extern "C" { ... }
(que no entiendo, porque no debería haber ninguna palabra clave bool
al compilar como C?)
Intenté quitar el bloque de #ifndef _BOOL
a #endif
y compilando como C++, y obtengo errores:
error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'
Simplemente no entiendo cómo el compilador de C++ se queja de una redefinición de bool
sin embargo, cuando elimino la redefinición e intento simplemente usar bool
para definir variables, no encuentra nada.
Cualquier ayuda es muy apreciada.
Luciano Grigore
Porque bool
es un tipo básico en C++ (pero no en C) y no se puede redefinir.
Puede rodear su código con
#ifndef __cplusplus
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
-
Pero ese código también es incompatible con el de C99.
stdbool.h
¡tener cuidado!– Ricardo J. Ross III
17 mayo 2012 a las 12:57
-
Todavía se está quejando de
char followed by bool is illegal
eso significa que no está leyendo el_cplusplus
¿definir?– preliquia
17 mayo 2012 a las 13:00
-
@prelic son dos guiones bajos antes
cplusplus
.– Ricardo J. Ross III
17 mayo 2012 a las 13:01
Ricardo J. Ross III
Puedes usar C99 bool
:
#ifndef __cplusplus
#include <stdbool.h>
#endif
bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type.
¿Por qué deberías usar esto?
Para compatibilidad con otro código C99. _Bool
se usa comúnmente en el código C99 y es muy útil. También le otorga la capacidad de tener un tipo de datos booleano sin la necesidad de tipear muchas cosas, como detrás de escena, _Bool
es un tipo de datos definido por el compilador.
-
Nada ocupa un bit en la memoria. ¿Querías escribir byte?
– Lucian Grigore
17 mayo 2012 a las 12:59
-
@LuchianGrigore no, quise decir un poco. Mire en los campos de bits, cuando en una estructura, los booleanos se empaquetan de manera similar.
– Ricardo J. Ross III
17 mayo 2012 a las 13:00
-
El estándar no dice nada sobre el tamaño, aparte del tamaño del char. El resto está definido por la implementación. Puede haber compiladores compatibles con los estándares que usen 1 Mb para almacenar un bool.
– Lucian Grigore
17 mayo 2012 a las 13:02
-
Pero aún así, la primera parte de su respuesta, que debe usar
stdbool.h
en lugar de definir su propio bool – es correcto.– R.. GitHub DEJA DE AYUDAR A ICE
17 mayo 2012 a las 13:06
-
@Richard si las estructuras están empaquetadas
bool
s en bits individuales, ¿cómo&someStruct.someBoolMember
¿trabajar? Estas diciendo esosizeof(bool *) > sizeof(int *)
? Y esosizeof(bool)
de alguna manera devuelve 1/8 en unsize_t
. Otro qué elvector<bool>
especialización y campos de bits,bool
s siempre ocupa al menos un byte.– IronMensan
17 mayo 2012 a las 13:10
Deberías usar el __cplusplus
macro:
#ifndef __cplusplus
#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
#endif
Mira esto enlace a las preguntas frecuentes de C++ para mas detalles.
justin hirsch
También tuve este problema “‘char’ seguido de ‘bool’ es ilegal” en VS. El problema para mí fue que no terminé mi declaración de clase con un punto y coma, lo cual no esperaba que fuera el problema, ya que estaba en el archivo de encabezado y el problema aparecía en el archivo cpp. p.ej:
class myClass
{
}; // <-- put the semi colon !!
Tenga en cuenta que
extern "C"
no significa “compilar como C”. Significa “compilar con enlace C”. El código interno sigue siendo C ++, simplemente no puede definir nada que no se pueda vincular como C.–Steve Jessop
17 mayo 2012 a las 13:17