Как Paul R. answered, вам нужен код-заглушка. Кроме того, вы лучше убедитесь, что ваша функция C++ не выбрасывает exceptions (я полагаю, что функция C++, вызываемая из программы C и main
, которая генерирует неперехваченное исключение, имеет undefined behavior). BTW, вы должны быть уверены, что конструктор данных static
C++ (например, std::cout
) называется «концептуально» перед вашим main
в C (так что вам лучше связать свою программу с компилятором C++, а не с C). См GCC __attribute__(constructor)
В практике, по крайней мере, на Linux с C++ кода, составленный GCC (g++
) или Clang/LLVM (clang++
), функция C++ имеет некоторые mangled name.
Вы можете использовать некоторые уродливые и непереносимые трюки, чтобы вызвать функцию с помощью искаженного имени. Вы можете смело кодировать:
int main(int argc, char**argv) {
extern void* _Z10my_alloc_ci(int size);
void * p = _Z10my_alloc_ci(42);
return 0;
}
, но я немного стыжусь давать такие глупые советы. Вы даже можете использовать asm labels, например.
extern void*f(int) asm ("_Z10my_alloc_ci");
p = f(42);
Однако, я чувствую, что вы не должны иметь никаких таких подходов, и я удивлен, почему вам нужно вызвать функцию C++, которая не обернута вокруг extern "C"
. Обратите внимание: теоретически функции C++ (без extern "C"
) могут иметь и другие - и несовместимые - calling convention, чем функции C. Я не знаю, как это делается.Таким образом, чтобы быть в безопасности, вы должны обернуть функцию C++ с некоторыми C++ обертывания с использованием extern "C"
Чтобы избежать пойманных исключений, вы можете поймать их все в вашем C++ обертка:
#include <cstdio>
#include <cstdlib>
extern "C" void* my_alloc_c(int size) {
extern void* my_alloc(int);
try {
return my_alloc(size);
} catch (...) {
::fprintf(::stderr, "got uncaught C++ exception for my_alloc(%d)\n",
size);
::fflush(nullptr);
::abort();
}
}
BTW, если C++ библиотеки Возможно, вы попытаетесь автоматизировать генерацию кода клея. Например, вы можете настроить GCC, используя MELT (язык, подходящий для конкретного языка Lispy для расширения GCC), путем кодирования расширения в MELT, которое сгенерировало бы код при компиляции файлов заголовков C++.
Возможно, вас заинтересует libffi, который позволяет (переносимо) вызывать любую (C и, возможно, C++) функцию произвольной подписи.
Возможно, вы захотели 'malloc (size);' вместо 'malloc (sizeof (size));'. Но вы столкнетесь с проблемами, так как вам действительно нужно 'malloc (size * sizeof (int));' –
Nope - вам нужно объявить 'my_alloc' как' extern 'C "или реализовать оболочку в вашей библиотеке C++, которая делает это. –
@CoolGuy, который был типом, забудьте об этом, я смотрю, как вызвать my_alloc из библиотеки C. – Madhava