LINUX.ORG.RU

История изменений

Исправление 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, :

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
$ c++ -Wall -c sort.cpp
$ g++ -Wall -c sort.cpp
$ g++ -Wall prog.o sort.o
$ ./a.out 
abc
defabc
fer
zht
$ 

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