Как импортировать функцию 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.

Другие вопросы по тегам