Сведения о вопросе

1234123213

11:34, 12th August, 2020

Теги

c++   c   boolean   standards    

взаимодействие с stdbool.h C++

Просмотров: 537   Ответов: 3

В проекте я взаимодействую между C++ и библиотекой C, которая использует stdbool.h, определенный как таковой.

#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

Некоторые структуры имеют bool членов. Поэтому, если у меня есть одна из этих структур, определенных как локальные переменные в функции C++, и передать ее в функцию C, размеры будут несовместимы между C++ и C, поскольку bool-это один bye в C++ и 4 в C.

Есть ли у кого-нибудь советы, как преодолеть это, не прибегая к моему текущему решению, которое является

//#define bool _Bool
#define bool unsigned char

Что противоречит стандарту C99 для stdbool.h



  Сведения об ответе

piter

01:13, 20th August, 2020

Я нашел ответ на свой собственный вопрос, найдя более совместимую реализацию stdbool.h , которая соответствует стандарту 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

Это взято из проекта библиотеки классов Ada .


  Сведения об ответе

SSESION

10:26, 24th August, 2020

Размер-это не единственное, что здесь будет непоследовательно. В C++ bool-это ключевое слово, а C++ гарантирует, что bool может содержать значение либо 1, либо 0 и ничего больше. C не дает вам такой гарантии.

Тем не менее, если совместимость между C и C++ важна, вы можете эмулировать пользовательский логический код C, определив идентичный для C++ и используя его вместо встроенного bool. Это будет компромисс между ошибочным логическим выражением и идентичным поведением между логическим выражением C и логическим выражением C++.


  Сведения об ответе

$DOLLAR

11:12, 27th August, 2020

Логически, вы не можете совместно использовать исходный код между C и C++ с конфликтующими объявлениями для bool и связывать их друг с другом.

Единственный способ поделиться кодом и ссылкой - это использовать промежуточную структуру данных. К сожалению, насколько я понимаю, вы не можете изменить код, который определяет интерфейс между вашей программой C++ и библиотекой C. Если бы вы могли, я бы предложил использовать что-то вроде:

union boolean {
   bool value_cpp;
   int  value_c;
}; 

// подкладка может быть необходима в зависимости от степени завершенности

Это приведет к тому, что тип данных будет иметь одинаковую ширину в обоих языках; преобразование в собственный тип данных должно будет выполняться с обоих концов. Замените использование bool на boolean в определении библиотечной функции, код fiddle в библиотеке для преобразования, и все готово.

Итак, что вы собираетесь нужно сделать, вместо того, чтобы создать прокладку между программой C++ и библиотеки C.

У тебя есть:

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

А вам нужно творить:

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

А теперь вызовите library_func_1_cpp вместо этого.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться