Compruebe si bool está definido en C/C++ mixto

4 minutos de lectura

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 #endify 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 boolsin embargo, cuando elimino la redefinición e intento simplemente usar bool para definir variables, no encuentra nada.

Cualquier ayuda es muy apreciada.

  • 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


Avatar de usuario de Lucian Grigore
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 illegaleso 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

Avatar de usuario de Richard J. Ross III
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 bools en bits individuales, ¿cómo &someStruct.someBoolMember ¿trabajar? Estas diciendo eso sizeof(bool *) > sizeof(int *)? Y eso sizeof(bool) de alguna manera devuelve 1/8 en un size_t. Otro qué el vector<bool> especialización y campos de bits, bools 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.

Avatar de usuario de Justin Hirsch
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 !!

¿Ha sido útil esta solución?