LINUX.ORG.RU

func.cpp

auto Universe::myfabulousfunc(std::string &hail) {...}

extern "C" {
  int myfabulousfunc(char *str) {
    return Universe::myfabulousfunc(std::string(str));
  }
}

func.h

int myfabulousfunc(char *);

main.c

#include"func.h"
int main(int argc, char *argv[]){
  return myfabulousfunc(argv[1]);
}

anonymous
()
class DamnedEntity
{
DamnedEntity(int, int);
double SomeCoolMethod(double);
}

становится

struct DamnedEntity;
DamnedEntity *newDamnedEntity(int, int)
double *deSomeCoolMethod(DamnedEntity *e, double);
buddhist ★★★★★
()

Возможно ли написать обёртку для вызова функций библиотеки написанной на C++ из C?

Возможно. Но проще и надежнее будет переписать всё на Common Lisp.

anonymous
()

Как в Index.h в clang. Советую использовать вот этот браузер кода.

Говоря кратко, делается

typedef struct CXTranslationUnitImpl *CXTranslationUnit;
Причём структура Impl нигде не объявляется. Конструктор и деструктор заменяются на функции, возвращающие и освобождающие CXTranslationUnit, методы заменяются на функции, принимающие CXTranslationUnit первым аргументом.

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

Спасибо за совет))). Но он не очень уместен, так как задача стоит совершенно конкретная. Ни о каком Common Lisp речи не идет.

ChAnton ★★
() автор топика

Курить Name Mangling и жалеть себя

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

Скажи тем, кто ставит такие задачи, что только религия может помешать использованию С++. Особенно, если используются С++ библиотеки.

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

Попробуй написать C-обёртку для std::sort.

Эту обёртку написать достаточно просто. В чём конкретно Вы видите сложность?

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

Например в том, что это не функция.

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

Смотрите код aspell. Там как раз такое.

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

В передаваемом предикате сравнения соседних элементов (шаблонный параметр).

nikitos ★★★
()
Последнее исправление: nikitos (всего исправлений: 1)
Ответ на: комментарий от Sorcerer

nikitos

Примерно так:

Общий заголовок sort.h:

#ifdef __cplusplus
extern "C" {
#endif

#include <unistd.h>

typedef int (*cppsort_cmp)(const void *, const void *);
void cppsort(void **base, size_t nmemb, cppsort_cmp compar);

#ifdef __cplusplus
}
#endif

Часть на C++ (sort.cpp):

#include "sort.h"
#include <algorithm>

struct sorthelper {
    cppsort_cmp compar;

    sorthelper(cppsort_cmp compar_) { compar = compar_; }
    bool operator() (void *i, void *j) { return (compar(i, j) < 0); }
};

void
cppsort(void **base, size_t nmemb, cppsort_cmp compar)
{
    struct sorthelper helper(compar);
    std::sort(base, base + nmemb, helper);
}

Программа на C (prog.c):

#include "sort.h"
#include <stdio.h>
#include <string.h>

int
main(int argc, char **argv)
{
    char *array[] = {
        "defabc",
        "abc",
        "zht",
        "fer"
    };
    size_t i;

    cppsort((void **)array, sizeof(array) / sizeof(array[0]), (cppsort_cmp)strcmp);
    for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
        printf("%s\n", array[i]);
    return (0);
}

Запускаем:

$ gcc -Wall -c prog.c
$ g++ -Wall -c sort.cpp
$ g++ -Wall prog.o sort.o
$ ./a.out 
abc
defabc
fer
zht
$ 

Экспортируемая C-функция cppsort может сортировать любой массив указателей на произвольные данные. Массив структур любой заданной длины, правда, сортировать не может. Но не очень-то и хотелось. :)

Sorcerer ★★★★★
()
Последнее исправление: Sorcerer (всего исправлений: 1)
Ответ на: комментарий от Sorcerer

Это не обертка над std::sort, а фукция cppsort, реализованная с помощью std::sort ;)

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

В C уже есть qsort, и если б мне нужна была она, я бы её использовал, а так, присоединяюсь к анонимусу - это не обёртка над std::sort.

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

А что Вы хотели? Шаблоны в C? И раз уж Вы такой фанат qsort(), то зачем предлагали сделать обёртку для std::sort?

То, что я сделал - и есть обёртка, т.к. позволяет использовать в языке C код, написанный на другом языке, и не делает ничего сверх этого. Изменения интерфейса - это адаптация под реалии языка, и это нормально для обёртки.

Sorcerer ★★★★★
()
Последнее исправление: Sorcerer (всего исправлений: 1)
Ответ на: комментарий от Sorcerer

Ваша обёртка не обладает такой универсальностью, как необёрнутый std::sort. В вашем примере вы создали библиотечную функцию ограниченной функциональности (может сортировать любой массив указателей на произвольные данные, тоесть пользователю библиотеки, перед тем как вызвать обёртку, притендующую на универсальность, нужно ещё массив указателей на свои данные создать). Может, мы разный смысл вкладываем в слово «обёртка».

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

Это не обертка, т.к. вы урезали возможности до неузнаваемости.

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

Я считаю это обёрткой с ограниченными возможностями. Неполное покрытие функциональности обёрткой ещё не означает, что она перестаёт быть обёрткой. Вы ведь не будете спорить с тем, что основную функцию - собственно сортировку - обёртка выполняет. В реальной жизни даже ограниченных возможностей может быть вполне достаточно. И потом, выше был всего лишь пример. Его можно расширить до интерфейса qsort(), передав размер элемента, но тогда код обёртки существенно возрастёт и потеряет наглядность (потребуется реализовать фэйковый итератор).

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