2016-08-20 13 views
0

我正在尝试将一些用C编写的函数包含到C++项目中。我遵循these的说明进行了很多工作。 不幸的是,我不需要调用的所有C函数都在c头文件中声明。有些只是在“.c-files”中定义的静态函数。如何将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_function(...)被宣布为好“的.c文件”标题中声明。这意味着我需要在c_function(...)的前向声明之前包含标题,但显然这会使链接器监督定义。

A中的C++代码的非常simplyfied版本看起来大致是这样的: 头文件 “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调用(这可能是为什么它是'静态'),为什么它应该从C++调用?并且:你永远不会在C头文件中放置一个'static'。这是无稽之谈。 – tofro

+1

除非你计划'#include'.c文件到你的翻译单元(yuck),而不* *在这个范例之外编译它们,那些'static'函数并不存在。关于cpp文件。但是,从你的具体情况来看,这是一个可怕的选择。 – WhozCraig

回答

1

清洁答案:否。在翻译单元(通常为.c或.cpp文件)中声明为静态的函数在其他任何地方都不可访问,即使您转发声明了正确的函数signat URE。

凌乱的答案,不建议的:#include违规.c文件到您的.cpp文件,看看它是否工作。我会认为这是一个黑客。实现文件包含的名称意味着什么:实现,而不是接口。这通常意味着你不应该知道它里面发生了什么,它可能会在版本之间改变。

如果你知道谁是保持来源的家伙,你也可以尝试联系他,并问他是否可以使公共接口的功能部分,即把它放在一个头,并使其非静态。

0

我建议你复制功能集成到一个新的文件。使它们不是静态的。为他们创建一个头文件,并将其包含在你的cpp中。