2016-08-20 6 views
0

Я пытаюсь включить некоторые функции, написанные на 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); 
} 
+6

'static' функции являются внутренними для модуля, в котором они определены. Вы не можете связаться с ними извне. – melpomene

+0

@melpomene Точно. Если он не должен вызываться из C (возможно, это почему-то «static»), почему он должен быть вызван из C++? И: вы никогда не ставите 'static' в заголовочный файл C. Это чепуха. – tofro

+1

Если вы не планируете также «включать» файлы .c в свою единицу перевода (yuck) и * not * компилировать их за пределами этой парадигмы, эти «статические» функции не существуют до вашего. cpp файл. Это, однако, отвратительный вариант взглядов вашего конкретного случая. – WhozCraig

ответ

1

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^