Domanda

In un progetto sto interfacciando tra C++ e una libreria C che utilizza stdbool.h definito come tale.

#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

Alcune strutture hanno bool membri.Quindi, se ho una di queste strutture definita come variabili locali all'interno di una funzione C++ e la passo a una funzione C, le dimensioni non sono coerenti tra C++ e C poiché bool è un bye in C++ e 4 in C.

Qualcuno ha qualche consiglio su come superare questo problema senza ricorrere alla mia attuale soluzione che è

//#define bool _Bool
#define bool unsigned char

Il che è contrario allo standard C99 per stdbool.h

È stato utile?

Soluzione

Ho trovato la risposta alla mia domanda trovando un'implementazione più compatibile di stdbool.h che è conforme allo standard 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

Questo è tratto da Biblioteca di classi Ada progetto.

Altri suggerimenti

La dimensione non è l’unica cosa che sarà incoerente qui.In C++ bool è una parola chiave e C++ garantisce che un bool possa contenere un valore 1 o 0 e nient'altro.C non ti dà questa garanzia.

Detto questo, se l'interoperabilità tra C e C++ è importante, puoi emulare il booleano personalizzato di C definendone uno identico per C++ e utilizzandolo al posto del bool integrato.Questo sarà un compromesso tra un booleano difettoso e un comportamento identico tra il booleano C e il booleano C++.

Logicamente, non è possibile condividere il codice sorgente tra C e C++ con dichiarazioni in conflitto per bool e collegarli tra loro.

L'unico modo per condividere codice e collegamento è tramite una struttura dati intermedia.Sfortunatamente, da quanto ho capito, non puoi modificare il codice che definisce l'interfaccia tra il tuo programma C++ e la libreria C.Se potessi, suggerirei di usare qualcosa come:

union boolean {
   bool value_cpp;
   int  value_c;
}; 

// l'imbottitura potrebbe essere necessaria a seconda endianità

L'effetto sarà quello di rendere il tipo di dati della stessa larghezza in entrambe le lingue;la conversione al tipo di dati nativo dovrà essere eseguita su entrambe le estremità.Scambia l'uso di bool con booleano nella definizione della funzione di libreria, manipola il codice nella libreria per convertire e il gioco è fatto.

Quindi, quello che dovrai fare invece è creare un file spessore tra il programma C++ e la libreria C.

Hai:

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

E devi creare:

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

E ora chiama invece Library_func_1_cpp.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top