4 / 4 / 0
Регистрация: 26.08.2014
Сообщений: 110
1

Декларирование C++ кода в extern "C"

26.08.2014, 19:08. Показов 1955. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как правильно декларировать C++ код в extern "C" ? чтобы подтянуть его через cpython (http://stackoverflow.com/quest... rom-python)

Например есть класс :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class My_Init: public MyPacket
{
public:
 
    My_Init();
    My_Init( const unsigned char *bytes, unsigned int length );
 
protected:
    void _initMembers();
    int ololo;
 
public:
    virtual bool         decode();
    virtual bool         decode( unsigned char *data2 );
    static bool          MyMod( unsigned char *data );
    unsigned int  Version[4];
}
как правильно задекларировать его, чтобы потом подтянуть в python через ctypes ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2014, 19:08
Ответы с готовыми решениями:

Организация кода, вывод строки в консоли, использование extern
Windows 7, Visual Studio 2013. В проекте файлы:// TestCpp.h using namespace std; extern...

Декларирование классов
помогите пожалуйста................. :((((( Найти сумму n членов ряда Фибоначчи.

Декларирование переменной
Здарвствуйте! Скажи пожалуйста, можно ли как-то избавится от повторяющизся участков кода для записи...

Декларирование классов
Условие: Вычислить сумму первых n натуральных чисел, кратных 3. Задание: Создать класс в...

10
Заблокирован
26.08.2014, 19:17 2
Цитата Сообщение от i_am_kisly Посмотреть сообщение
Как правильно декларировать C++ код в extern "C"
extern "C"
{
... тут твой любой код
}
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.08.2014, 19:18 3
в общем случае никак. гуглите умеет ли ваш компилятор экспортировать классы.
0
4 / 4 / 0
Регистрация: 26.08.2014
Сообщений: 110
26.08.2014, 19:27  [ТС] 4
да как бы умеет
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.08.2014, 19:30 5
По ссылке в первом посте есть же пример - что я упускаю?
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
26.08.2014, 19:37 6
Цитата Сообщение от i_am_kisly Посмотреть сообщение
Например есть класс
extern "C" и экспорт вещи ортогональные.
extern "C" задает тип linkage, чтобы привести ABI в соответствие с принятым в С. Следовательно с классами ее использовать вообще нельзя.
Такие вещи делаются подругому.

Добавлено через 4 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
По ссылке в первом посте есть же пример - что я упускаю?
Кстати да. По ссылке все есть. Там предлагают каждый метод обернуть в свою функцию (с extern "C"), принимающую указатель на объект класса. И это правильный подход.
0
4 / 4 / 0
Регистрация: 26.08.2014
Сообщений: 110
27.08.2014, 11:46  [ТС] 7
Цитата Сообщение от 0x10 Посмотреть сообщение
По ссылке в первом посте есть же пример - что я упускаю?
я не понимаю двух вещей :
1) как задекларировать атрибут "Version" ?
2) что означает выведенный из скобок public MyPacket вот тут : class My_Init: public MyPacket {} ?

Для чего мне всё это нужно ? Пишу на python. В программе имеется "бутылочное горлышко", решить можно подключив нативную shared lib.

Добавлено через 1 час 24 минуты
хмм.. порадовал SWIG ! ему достаточно скормить h\hpp файлы

Добавлено через 14 часов 40 минут
теперь ложка дегтя в бочку мёда :
по умолчанию swig игноритъ overloaded operators. Вот что help по этому поводу говорит http://www.swig.org/Doc1.3/SWI... GPlus_nn28
окей, я знаписал %rename для operators=, operators+ и operators-, а для operators[] не понимаю как.
C++
1
2
3
4
public: // operators
    /** Calls getByteAt( index ) */
    unsigned char operator[]( int index ) const;
    /**
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.08.2014, 11:57 8
i_am_kisly, По хорошему это __getitem__.
Так что просто
C++
1
%rename(__getitem__) Class::operator [];
1
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
27.08.2014, 12:00 9
Воу, зачем руками-то, когда boost.python есть
0
4 / 4 / 0
Регистрация: 26.08.2014
Сообщений: 110
27.08.2014, 12:34  [ТС] 10
если мне не изменяет память, то он не избавляет от необходимости декларировать классы/функции для доступа из python
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.08.2014, 12:38 11
i_am_kisly, Не избавляет, зато более в С++-style, нежели swig.
0
27.08.2014, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2014, 12:38
Помогаю со студенческими работами здесь

Декларирование класса
Здравствуйте. Подскажите, как сделать так, чтобы класс декларировался только если не был...

Декларирование функции
Здравствуйте. Помогите пожалуйста! Как правильно декларировать дополнительные функции? Если с...

Декларирование функции API
У функции есть параметр типа WCHAR. Подскажите, пожалуйста, что это за тип и как в этот параметр...

Обязательное декларирование приватных функций
Доброго времени суток! Как-то можно отучить кьют требовать обязательное объявление всех приватных...

Декларирование атрибутов динамических объектов
Здравствуйте. Пишу шахматную программу. Решил использовать динамические объекты. Проблема...

Декларирование процедур обработки события эл. управления?
Создал программным путем эл. управления CommandButton, т.е. во время загрузки формы. Как теперь...

Что означает extern "C" или extern "C++"?
Например такой код, extern "C" void f(); Или C++ вместо C. Что это означает и где это применяется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru