LINUX.ORG.RU

CLIPS и C++


0

0

Привет всем. У меня есть один важный и срочный вопросик. Есть у меня программулина, написанная на C++, и есть CLIPS, с которым эту прогу надо интегрировать. Проблема в том, что из моей проги функции CLIPS'а вызвать можно (через объявление их как функции чистого С), а вот обратую вещь - из CLIPS'a вызвать функции С++ - не получается. Кто-нибудь знает, как эту проблему решить ? Пробовал скомпилить CLIPS как C++-приложение, но он выдает кучу ошибок и не собирается, хотя в мануале написано, что это работает. Я смотрел исходники - но там действительно куча вещей, несовместимых с С++, начиная с того, что нужно вручную приводить типы данных (это можно сделать), до того, что в одной стркуктуре имя поля - template !!! А это же ключевое слово С++. В общем кто чем может помочь - буду очень рад. Всем спасибо.

anonymous

Ответ на: комментарий от Esh

CLIPS - Это средство создания экспертных систем - в общем в данном случае это и не важно. Важно то, что нужно обеспечить взаимодействие С-шной и С++-ной программ. Как я писал, С-шные функции из С++ вызываются, а вот возможно ли обратное, то есть С++-ные из чистого С ?

anonymous
()
Ответ на: комментарий от anonymous

Единственное, что пришло в голову - объявление extern "C"

hbee ★★★★
()
Ответ на: комментарий от anonymous

> а вот возможно ли обратное, то есть С++-ные из чистого С ?

Возможно, если все плюсовое API обернуть в сишные функции и использовать плюсовый линкер.

amm
()
Ответ на: комментарий от amm

А вот тут можно поподробнее ? Ну или хотя бы пару примеров (ссылок) для дальнейшего ознакомления ?

anonymous
()
Ответ на: комментарий от anonymous

$ cat 1.h
#ifdef __cplusplus
extern "C" {
#endif

void* create_A();

void destroy_A(void *pA);

int A_func(void *pA, const char *);

#ifdef __cplusplus
}
#endif

$ cat 1.cc
#include <iostream>

#include "1.h"

class A
{
public:
        int func(const char *str)
        {
                std::cout << str << std::endl;
                return 1;
        }
};

extern "C" void* create_A()
{
        return new A();
}

extern "C" void destroy_A(void *pA)
{
        delete static_cast<A*>(pA);
}

extern "C" int A_func(void *pA, const char *str)
{
        A *p = static_cast<A*>(pA);
        return p->func(str);
}

$ cat 2.c
#include "1.h"

int
main()
{
        void *pA = create_A();
        A_func(pA, "Hello, world!");
        destroy_A(pA);
        return 0;
}

$ c++ 1.cc -c -W -Wall -pedantic -ansi
$ cc 2.c -c -W -Wall -pedantic -ansi
$ c++ 1.o 2.o -o 1                    
$ ./1
Hello, world!

execve
()
Ответ на: комментарий от anonymous

Посмотри swig (www.swig.org), он может создавать обертки вокруг классов для языков, расширения которых пишутся на C.

amm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.