Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
взаимодействие с stdbool.h C++
В проекте я взаимодействую между 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
Я нашел ответ на свой собственный вопрос, найдя более совместимую реализацию 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 .
Размер-это не единственное, что здесь будет непоследовательно. В C++ bool-это ключевое слово, а C++ гарантирует, что bool может содержать значение либо 1, либо 0 и ничего больше. C не дает вам такой гарантии.
Тем не менее, если совместимость между C и C++ важна, вы можете эмулировать пользовательский логический код C, определив идентичный для C++ и используя его вместо встроенного bool. Это будет компромисс между ошибочным логическим выражением и идентичным поведением между логическим выражением C и логическим выражением C++.
Логически, вы не можете совместно использовать исходный код между 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 вместо этого.