2012-05-17 22 views
9

Tengo problemas con algún código que he heredado. Este código se estaba desarrollando bien en un entorno C-only, pero ahora necesito usar C++ para llamar a este código. La cabecera problem.h contiene:Comprueba si bool está definido en C/C++

#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 compilo como código C++, consigo error C2632: 'char' followed by 'bool' is illegal

me sale el mismo error si envuelvo la #include "problem.h" en extern "C" { ... } (que no entiendo, porque no debe ninguna palabra clave bool cuando se compila como C)

intenté quitar el bloque de #ifndef _BOOL a #endif, y compilar como C++ y recibo mensajes de error:?

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 se quita la redefinición y tratar de usar sólo bool para definir las variables, no se encontró nada .

Cualquier ayuda es muy apreciada.

+2

Tenga en cuenta que 'extern" C "' no significa "compilar como C". Significa "compilar con enlace C". El código dentro todavía es C++, simplemente no se puede definir nada que no se pueda vincular como C. –

Respuesta

15

Porque bool es un tipo básico en C++ (pero no en C), y no se puede redefinir.

Puede poner en su código con

#ifndef __cplusplus 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
+0

Damnit, me ganaste :) –

+1

Pero ese código también es incompatible con 'stdbool.h' de C99, ¡tener cuidado! –

+0

Todavía se queja de que 'char seguido por bool es ilegal', ¿eso significa que no está leyendo la definición '_cplusplus'? – prelic

5

Se puede utilizar de bool C99:

#ifndef __cplusplus 
#include <stdbool.h> 
#endif 

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type. 

¿Por qué utilizar esto?

Para compatibilidad con otros códigos C99. _Bool se usa comúnmente en C99 Code, y es muy útil. También le otorga la capacidad de tener un tipo de datos booleanos sin la necesidad de tipear un montón de cosas, ya que detrás de las escenas, _Bool es un tipo de datos definido por el compilador.

+0

Nada lleva un bit en la memoria. ¿Querías escribir byte? –

+0

@LuchianGrigore no, me refiero un poco. Mire en los campos de bits, cuando en una estructura, bools se empacan de una manera similar. –

+0

La norma no dice nada de tamaño, aparte del tamaño de char. El resto es implementación definida. Pueden existir compiladores que cumplan con los estándares que usan 1Mb para almacenar un bool. –

1

Se debe utilizar la macro __cplusplus:

#ifndef __cplusplus 
#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
#endif 

Control hacia fuera este link to the C++ FAQ para más detalles.

-3

Tuve este "problema" seguido de "bool" es ilegal "en VS también. El problema para mí fue que no finalicé mi declaración de clase con un punto y coma, que no esperaba ser el problema, ya que estaba en el archivo de cabecera y el problema estaba en el archivo cpp. por ejemplo:

class myClass 
{ 

}; // <-- put the semi colon !! 
+2

¿Cómo se relaciona eso con 'bool' como la pregunta? –

+0

también recibía el error VS que se publicó en la pregunta de "'char' seguido de 'bool' es ilegal" en VS - la solución para mí fue solo agregar el punto y coma al final de la declaración de clase. –

+0

@JustinHirsch Visual Studio es un IDE, no un lenguaje de programación. – cybermonkey

Cuestiones relacionadas