Frage

In einem Projekt, das ich zwischen C ++ Schnittstelle bin und eine C-Bibliothek, die stdbool.h als solche definiert verwendet.

#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

Einige Strukturen haben bool Mitglieder. Also, wenn ich eine dieser Strukturen definiert als lokale Variablen innerhalb einer C ++ Funktion haben und übergeben es an einer C-Funktion sind die Größen inkonsistent zwischen C ++ und C als Bool ein Freilos in C ++ und 4 in C ist.

Hat jemand einen Rat, wie diese zu überwinden, ohne auf meine derzeitige Lösung zurückgreifen, was

//#define bool _Bool
#define bool unsigned char

, die gegen den C99-Standard ist für stdbool.h

War es hilfreich?

Lösung

fand ich die Antwort auf meine eigene Frage, indem sie eine kompatible Implementierung von stdbool.h zu finden, die mit dem C99-Standard kompatibel ist.

#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

Unter diesem Begriff ist aus dem Ada-Klassenbibliothek Projekt.

Andere Tipps

Die Größe ist nicht das einzige, was hier inkonsistent sein wird. In C ++ Bool ist ein Schlüsselwort, und C ++ garantiert, dass ein Bool einen Wert von entweder 1 oder 0 und sonst nichts halten kann. C nicht geben Sie diese Garantie.

Das heißt, wenn die Interoperabilität zwischen C und C ++ wichtig ist, dass Sie C die maßgefertigte boolean durch Definieren eines identischen für C ++ emulieren kann und mit, dass anstelle des eingebauten Bool. Das wird ein Kompromiss zwischen einem Buggy boolean und identischem Verhalten zwischen dem C boolean und dem C ++ boolean sein.

Logisch, sind Sie nicht in der Lage Quellcode zwischen C und C ++ mit widersprüchlichen Erklärungen für Bool zu teilen und sie miteinander verbinden.

Die einzige Möglichkeit, Code und Link ist über einen Vermittler Datenstruktur teilen können. Leider von dem, was ich verstehe, kann man nicht den Code ändern, der die Schnittstelle zwischen Ihrem C ++ Programm und C-Bibliothek definiert. Wenn Sie könnten, ich würde vorschlagen, mit so etwas wie:

union boolean {
   bool value_cpp;
   int  value_c;
}; 

// Polsterung kann notwendig sein, abhängig von endianness

Die Wirkung davon wird es sein, den Datentyp in beiden Sprachen die gleiche Breite zu machen; Umwandlung in dem nativen Datentyp muß an beiden Enden durchgeführt werden. Tauschen Sie die Verwendung von Bool für boolean in der Bibliothek Funktionsdefinition, Geige Code in der Bibliothek zu konvertieren, und Sie sind fertig.

Also, was du stattdessen zu tun haben, ist erstellen Shim zwischen dem C ++ Programm und der C-Bibliothek.

Sie haben:

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

Und Sie müssen erstellen:

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);
}

Und jetzt rufen library_func_1_cpp statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top