Как импортировать функцию C в проект C ++, который не был объявлен в заголовке 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
}

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);
}

0

Решение

Чистый ответ: Нет. Функции, объявленные статическими в модуле перевода (как правило, файлы .c или .cpp), недоступны где-либо еще, даже если вы отправите объявление правильной сигнатуры функции.

Грязный ответ, не рекомендую: # включить оскорбительный файл .c в ваш файл .cpp и посмотреть, работает ли он. Я бы посчитал это хаком. Файлы реализации содержат именно то, что подразумевает название: реализации, а не интерфейсы. Обычно это означает, что вы не должны знать о том, что происходит внутри него, и что это может меняться в зависимости от версии.

Если вы знаете парня, который поддерживает источники, вы также можете попытаться связаться с ним и спросить, может ли он сделать функцию частью открытого интерфейса, то есть поместить ее в заголовок и сделать ее нестатической.

1

Другие решения

Я предлагаю вам скопировать функции в новый файл. Сделайте их не статичными. Сделайте для них заголовочный файл и включите его в свой cpp.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector