История изменений
Исправление Sorcerer, (текущая версия) :
Примерно так:
Общий заголовок 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, :
Примерно так:
Общий заголовок 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 может сортировать любой массив указателей на произвольные данные. Массив структур любой заданной длины, правда, сортировать не может. Но не очень-то и хотелось. :)