2010-08-20 18 views
13

Escribí una colección de estructuras de datos y funciones en C, algunas de las cuales usan el tipo de datos _Bool. Cuando comencé, el proyecto iba a ser pura C. Ahora estoy investigando el uso de un kit de herramientas GUI basado en C++ y he convertido el código de back-end en una biblioteca._Bool y bool: ¿Cómo resuelvo el problema de una biblioteca C que usa _Bool?

Sin embargo, al elaborar el C++ GUI el siguiente error se emite por el compilador:

ISO C++ forbids declaration of '_Bool' with no type

inicialmente pensé que podría buscar & reemplazar _Bool-bool y crear:

/* mybool.h */ 
#ifndef MYBOOL_H 
#define MYBOOL_H 

typedef _Bool bool; 

#endif /* MYBOOL_H */ 

y luego en cualquier encabezado que use _Bool

#ifdef __cplusplus 
extern "C" { 
#else 
#include "mybool.h" 
#endif 

/* rest of header... */ 

Hasta que me di cuenta de que esto compilaría la biblioteca con un tipo de datos booleano (C _Bool) y vincularlos con otra biblioteca (C++ bool). Prácticamente, esto puede no importar, pero teóricamente, probablemente sí (puede haber algún sistema oscuro en alguna parte que haciendo esto haga que el universo se voltee al revés).

Supongo que podría usar un int y usar 0 para falso y 1 para verdadero, y escribirlo con algo como typedef int mybool, pero parece poco atractivo.

¿Hay una forma mejor/idiomática/estándar para hacer esto?

+1

Haga que el comentario sea una respuesta, 'bool' es como' _Bool' está pensado para ser utilizado normalmente. –

+1

Entonces, ¿no necesito preocuparme por el universo girando de adentro hacia afuera? –

Respuesta

5

Dumbass! Solo #include <stdbool.h> y use bool.

+5

tonto culo: (adjetivo) extremadamente poco inteligente. (Hyphenated. Ver "culo"). ¿Quiere decir que, en contraste, es extremadamente más inteligente porque sabe que debe incluir #include para usar bool en C. No me atrevo a decir lo que pienso de su respuesta. –

+9

¿Por qué? Sí, en contraste con mi yo tonto, por supuesto que soy más inteligente. –

+0

Acepté mi propia respuesta y mi decisión de llamarme tonto (por no darme cuenta ** antes ** de hacer la pregunta en stackoverflow.com). –

-4

use typedef int _Bool para su código C y C++. Me sorprendería si _Bool se define como cualquier otra cosa.

+8

_Bool es del tipo nativo C99. –

+0

Así no puedes. –

+1

@JamesMorris: no solo es el tipo nativo, su nombre es una palabra clave (suponiendo que el compilador de C sea compatible con C99 o posterior). –

11

Si el compiladores de C y C++ que utiliza son del mismo proveedor entonces yo esperaría que el C _Bool ser del mismo tipo que C++ bool, y que incluir <stdbool.h> haría todo muy bien interoperables. Si son de diferentes proveedores, entonces deberá verificar la compatibilidad.

Tenga en cuenta que siempre puede probar la macro __cplusplus en su encabezado para determinar si el código se compila o no como C++, y establecer los tipos de forma adecuada.

+0

Siempre puedo probar la macro __cplusplus en mi encabezado ... Mmmm sí, bien visto. –

+0

http://stackoverflow.com/questions/25461/interfacing-with-stdbool-hc es un ejemplo de un caso en el que no son compatibles, aunque el problema era un 'stdbool.h' no proporcionado por el compilador. encabezamiento. –

1

Creo que uno debe usar bool en cualquier proyecto, para tener compatibilidad con C++, si es necesario.

El tipo de datos _Bool en C99 existe para evitar conflictos con posibles versiones existentes de bool que los programadores podrían haberse definido antes que el estándar C99. Por lo tanto, el programador puede elegir la mejor manera de adaptar sus viejos programas C para migrar hacia el nuevo estándar. Por lo tanto, creo que utilizar la palabra bool es realmente el deseo del comité de normalización C99, pero se ha visto forzado a rodear los problemas de incompatibilidad al definir la palabra fea _Bool. Esto muestra que el programador probablemente tenga que usar la palabra "prevista" bool en sus proyectos. Es la palabra más lógica para declarar un tipo booleano en un programa.

En algunos casos, podría ser una buena idea para mantener una definición preexistente programador de bool y, en otros casos, sería mejor utilizar la versión bool definido en <stdbool.h>. El programador debe decidir qué es mejor en cada caso y, además, tal vez, considerar si una migración gradual al <stdbool.h> es una buena acción.

Si está comenzando un proyecto desde cero, entonces probablemente el mejor enfoque es utilizar bool definido en <stdbool.h>.

3

Formalmente, no hay solución para este problema. El tipo _Bool existe solo en C. El lenguaje C++ no proporciona ningún tipo que garantice la compatibilidad binaria con _Bool. C++ bool no se garantiza que sea compatible.

La solución adecuada es no usar bool o _Bool en las declaraciones de parámetros de las funciones C que están destinadas a ser accesibles directamente (es decir, enlazables) desde el código C++. Use int, char o cualquier otro tipo que garantice ser compatible.

+2

Dudo que 'int' o' char' _guaranteed_ sean compatibles entre C y C++. Puede afirmarse que es verdadero en la documentación del compilador, pero en general esta afirmación es falsa. Y si la documentación indica 'int's compatibles, no veo por qué no debería decir lo mismo sobre' bool'. – magras

Cuestiones relacionadas