Я пытаюсь включить некоторые функции, написанные на C в проект C++. Я пришел довольно далеко, следуя инструкциям these. К сожалению, не все функции C, которые мне требуются для вызова, объявляются в файле заголовка c. Некоторые из них - это только статические функции, определенные внутри «.c-файлов».Как импортировать функцию C в проект C++, который не был объявлен в заголовке C?
Есть ли способ по-прежнему вызывать такие «не объявленные C-функции» внутри класса моего проекта на C++ без изменения источников C (которые не поддерживаются мной)?
Я уже думал об вперед объявлении функции C сам в моей C++ заголовок так:
extern "C"
{
#include "c_header_1.h"
static void c_function(int* out, const unsigned char len, const some_c_struct* st);
#include "c_header_2.h
}
НКУ только сообщает об ошибке:
warning: void c_function(int*, const unsigned char, const some_c_struct*); declared static but never defined [-Wunused-function].
Указатель на структуру, передаваемый в качестве 3-го параметра c_function(int*, const unsigned char, const some_c_struct*)
, похоже, делает вещи еще более сложными, так как этот тип some_c_struct
объявлен внутри заголовка, принадлежащего «.c-файлу», и объявляется c_function(...)
. Это означает, что мне нужно включить заголовок перед передним объявлением c_function(...)
, но, видимо, это заставляет компоновщик контролировать определение.
Очень simplyfied версия кода C++ выглядит примерно это: Заголовок файла "CppClass.h":
#ifndef CPP_CLASS_H
#define CPP_CLASS_H
extern "C"
{
#include "c_header_1.h"
#include "c_header_2.h"
...
}
class CppClass
{
public:
//...
void some_member();
//...
};
#endif
осуществления "CppClass.cpp"
//...
void CppClass::some_member()
{
//...
::c_func_x(32, &data); // call to function in c_header_1
//...
::c_func_y(&data2); // call to function in c_header_2
::c_function(data3, len, st);
}
'static' функции являются внутренними для модуля, в котором они определены. Вы не можете связаться с ними извне. – melpomene
@melpomene Точно. Если он не должен вызываться из C (возможно, это почему-то «static»), почему он должен быть вызван из C++? И: вы никогда не ставите 'static' в заголовочный файл C. Это чепуха. – tofro
Если вы не планируете также «включать» файлы .c в свою единицу перевода (yuck) и * not * компилировать их за пределами этой парадигмы, эти «статические» функции не существуют до вашего. cpp файл. Это, однако, отвратительный вариант взглядов вашего конкретного случая. – WhozCraig