2008-08-24 7 views
13

En un proyecto estoy interactuando entre C++ y una biblioteca C que usa stdbool.h definido como tal.interconectando con stdbool.h C++

#ifndef _STDBOOL_H 
#define _STDBOOL_H 

/* C99 Boolean types for compilers without C99 support */ 
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */ 
#if !defined(__cplusplus) 

#if !defined(__GNUC__) 
/* _Bool builtin type is included in GCC */ 
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; 
#endif 

#define bool _Bool 
#define true 1 
#define false 0 
#define __bool_true_false_are_defined 1 

#endif 

#endif 

Algunas estructuras tienen bool miembros. Entonces si tengo una de estas estructuras definida como variables locales dentro de una función C++ y la paso a una función C los tamaños son inconsistentes entre C++ y C ya que bool es un bye en C++ y 4 en C.

¿Alguien tiene algún consejo a la manera de superar esto sin tener que recurrir a mi solución actual que es

//#define bool _Bool 
#define bool unsigned char 

sea conforme a la norma C99 para stdbool.h

Respuesta

10

Encontré la respuesta a mi propia pregunta al encontrar una implementación más compatible de stdbool.h que cumple con la norma C99.

#ifndef _STDBOOL_H 
#define _STDBOOL_H 

#include <stdint.h> 

/* C99 Boolean types for compilers without C99 support */ 
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */ 
#if !defined(__cplusplus) 

#if !defined(__GNUC__) 
/* _Bool builtin type is included in GCC */ 
/* ISO C Standard: 5.2.5 An object declared as 
type _Bool is large enough to store 
the values 0 and 1. */ 
/* We choose 8 bit to match C++ */ 
/* It must also promote to integer */ 
typedef int8_t _Bool; 
#endif 

/* ISO C Standard: 7.16 Boolean type */ 
#define bool _Bool 
#define true 1 
#define false 0 
#define __bool_true_false_are_defined 1 

#endif 

#endif 

Esto está tomado del proyecto Ada Class Library.

+0

Actualización: _Bool ahora se define en VS2013, por lo que también debemos verificar _MSC_VER <1800. http://msdn.microsoft.com/en-us/library/hh409293.aspx – Tom

1

tamaño no es el único que va a ser inconsistente aquí. En C++ bool es una palabra clave, y C++ garantiza que un bool puede contener un valor de 1 o 0 y nada más. C no te da esta garantía.

Dicho esto, si la interoperabilidad entre C y C++ es importante, puede emular el booleano personalizado de C al definir uno idéntico para C++ y usarlo en lugar del builtin bool. Esa será una compensación entre un bug booleano y un comportamiento idéntico entre el booleano de C y el booleano de C++.

0

Lógicamente, no puede compartir el código fuente entre C y C++ con declaraciones conflictivas para bool y hacer que se vinculen entre sí.

La única manera en que puede compartir código y enlace es a través de una estructura de datos intermediaria. Desafortunadamente, por lo que entiendo, no puede modificar el código que define la interfaz entre su programa C++ y la biblioteca C. Si pudiera, me gustaría sugerir el uso de algo como:

union boolean { 
    bool value_cpp; 
    int value_c; 
}; 

// relleno puede ser necesaria dependiendo de endianness

El efecto de los cuales será hacer que el tipo de datos de la misma anchura en ambos idiomas; la conversión al tipo de datos nativo tendrá que realizarse en ambos extremos. Cambia el uso de bool por boolean en la definición de función de la biblioteca, código de violín en la biblioteca para convertir, y listo.

Entonces, lo que vas a tener que hacer en su lugar es crear un shim entre el programa C++ y la biblioteca C.

tiene:

extern "C" bool library_func_1(int i, char c, bool b); 

y lo que necesita para crear:

bool library_func_1_cpp(int i, char c, bool b) 
{ 
    int result = library_func_1(i, c, static_cast<int>(b)); 
    return (result==true); 
} 

Y ahora llamar library_func_1_cpp lugar.