Я пытаюсь включить некоторые функции, написанные на 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
}
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);
}
Чистый ответ: Нет. Функции, объявленные статическими в модуле перевода (как правило, файлы .c или .cpp), недоступны где-либо еще, даже если вы отправите объявление правильной сигнатуры функции.
Грязный ответ, не рекомендую: # включить оскорбительный файл .c в ваш файл .cpp и посмотреть, работает ли он. Я бы посчитал это хаком. Файлы реализации содержат именно то, что подразумевает название: реализации, а не интерфейсы. Обычно это означает, что вы не должны знать о том, что происходит внутри него, и что это может меняться в зависимости от версии.
Если вы знаете парня, который поддерживает источники, вы также можете попытаться связаться с ним и спросить, может ли он сделать функцию частью открытого интерфейса, то есть поместить ее в заголовок и сделать ее нестатической.
Я предлагаю вам скопировать функции в новый файл. Сделайте их не статичными. Сделайте для них заголовочный файл и включите его в свой cpp.