Как импортировать функцию C в проект C++, который не был объявлен в заголовке C?
Я пытаюсь включить некоторые функции, написанные на C, в проект C++. Я пришел довольно далеко, следуя этим инструкциям. К сожалению, не все функции C, которые мне нужно вызывать, объявлены в заголовочном файле ac. Некоторые являются просто статическими функциями, определенными внутри ".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
}
GCC только сообщает об ошибке:
warning: void c_function(int*, const unsigned char, const some_c_struct*); declared static but never defined [-Wunused-function].
Указатель на структуру, переданный в качестве третьего параметра c_function(int*, const unsigned char, const some_c_struct*)
кажется, что все еще сложнее, так как этот тип some_c_struct
объявляется внутри заголовка, принадлежащего ".c-файлу" c_function(...)
заявлено также. Это означает, что мне нужно включить заголовок перед предварительным объявлением c_function(...)
но, очевидно, это заставляет компоновщика следить за определением.
Очень простая версия кода на 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);
}
2 ответа
Чистый ответ: Нет. Функции, объявленные статическими в модуле перевода (как правило, файлы.c или.cpp), больше нигде не доступны, даже если вы отправите объявление правильной сигнатуры функции.
Грязный ответ, не рекомендую: # включить оскорбительный файл.c в ваш файл.cpp и посмотреть, работает ли он. Я бы посчитал это хаком. Файлы реализации содержат именно то, что подразумевает название: реализации, а не интерфейсы. Обычно это означает, что вы не должны знать о том, что происходит внутри него, и что это может меняться в зависимости от версии.
Если вы знаете парня, который поддерживает источники, вы также можете попробовать связаться с ним и спросить, может ли он сделать функцию частью открытого интерфейса, то есть поместить его в заголовок и сделать его нестатичным.
Я предлагаю вам скопировать функции в новый файл. Сделайте их не статичными. Сделайте для них заголовочный файл и включите его в свой cpp.