Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2013, 13:12   #1
tiger()
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 49
По умолчанию Использование cpp функции в проекте c

Есть сишный проект, понадобилось прикрепить к нему один готовый плюсовый модуль.

Схематичный вид этого модуля:
Код:
//module.cpp
namespace module_namespace
{
  struct params
  {
    inline params() : field1(val1), field2(val2), field3(val3), field4(val4) { }

    inline type foo() const
    {
	...
    }

    type1 field1;
    type2 field2;
    type3 field3;
    type4 field4;
  };

...

bool abc(const params &comp_params = params());

}
Мне нужно: воспользоваться функцией abc из сишного main.
Но параметр функции - плюсовая структура с конструктором, из си никак не вызывается напрямую.

1. Создал отдельный header (extern_api.h), подключил его и к модулю и к main.
2. Описал в extern_api.h новую структуру params_c, которая содержит только поля, но не содержит конструкторов (чтобы было как си без плюсовых наворотов).
3. Сделал в модуле функцию-прокси abc_c, которая вызывается из си и из себя вызывает abc. Вместо params имеет параметр params_c, так что теперь ее можно вызывать из си.

Код:
//add to module.cpp
 bool abc_c(const params &comp_params = params())
    {
        return abc(comp_params);
    }
4. Добавил в структуру params еще один конструктор, который будет инициализироваться от типа params_c.
Код:
//updated module.cpp
  struct params
  {
    inline params() : field1(val1), field2(val2), field3(val3), field4(val4) { }
    inline params(params_c* p): field1(p->field1), field2(p->field2), field3(p->field3), field4(p->field4) { }

    inline type foo() const
    {
	...
    }

    type1 field1;
    type2 field2;
    type3 field3;
    type4 field4;
  };
5. Вытащил в exterm_api.h объявление abc_c.

Код:
//extern_api.h
    typedef struct
    {
       type1 field1;
       type2 field2;
       type3 field3;
       type4 field4;
    } params_c;

extern  bool abc_c(const params_c *comp_params);
6. Встроил в систему makefile'ов этот модуль, скомпилировал как библиотеку .a, прикрепил либу к main. То есть main теперь видит либу .a, где определена abc_c и видит extern_api.h, где она объявлена.

Получаю undefined reference к abc_c.

Либа нормальная, компилится без ошибок, формат читаемый, имя функции фигурирует.

Пробовал различные комбинации с
Код:
    #ifdef __cplusplus
    extern "C" {
    #endif
- не помогло. Куда это правильно поставить?

Еще есть ошибки с передачей параметра в abc, т.к. в объявлении и определении abc_c стоят параметры разных типов.

Как правильно настроить такую систему? Подскажите, пожалуйста, может я какую-нибудь ошибку не заметил..
tiger() вне форума Ответить с цитированием
Старый 17.07.2013, 14:54   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

должно быть:
extern "C" bool abc_c(const params_c *comp_params)
когда extern_api.h используется из cpp файла и должно быть как и сейчас, когда подключается в .c файл
waleri вне форума Ответить с цитированием
Старый 22.07.2013, 16:06   #3
tiger()
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 49
По умолчанию

Большое спасибо! помогло )
tiger() вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование using namespace System в MFC проекте kluz Помощь студентам 0 06.06.2013 12:40
Использование С# dll в проекте C++ Romowski Visual C++ 5 11.12.2012 08:59
Использование методов из проекта на С++ в проекте на C# scailfon Общие вопросы .NET 7 06.06.2011 23:40
Ex7_16.cpp. Непонятные функции в ссылочном классе ilya_t Visual C++ 3 23.08.2010 21:10
Использование DLL от третьей стороны в своем проекте Yuran Общие вопросы Delphi 10 02.06.2008 19:04