如何将 C 函数导入到尚未在 C header 中声明的 C++ 项目中?
How to import a C function into C++ project that has not been declared in a C header?
我正在尝试将一些用 C 编写的函数包含到 C++ 项目中。我已经按照 these 的说明走了很远。
不幸的是,并非我需要调用的所有 C 函数都在 c header 文件中声明。有些只是在“.c-files”.
中定义的静态函数
有没有办法仍然从我的 C++ 项目的 class 内部调用这样的 "non-declared-C-functions" 而无需更改 C 源代码(不是由我自己维护的)?
我已经考虑过在我的 C++ header 中自己向前声明 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-file" c_function(...)
也在其中声明。这意味着我需要在 c_function(...)
的前向声明之前包含 header 但显然这会使链接器监督定义。
一个非常简单的 C++ 代码版本大致如下:
Header 文件 "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 文件)中声明为静态的函数在其他任何地方都无法访问,即使您转发声明了正确的函数签名。
乱七八糟的答案,不推荐:#include 有问题的 .c 文件到你的 .cpp 文件中,看看它是否有效。我会认为这是一个黑客虽然。实现文件包含的正是名称所暗示的:实现,而不是接口。这通常意味着您不应该知道它内部发生了什么,并且它可能会在不同版本之间发生变化。
如果你认识维护源代码的人,你也可以尝试联系他并询问他是否可以将函数作为 public 接口的一部分,即将它放在 header并使其成为 non-static.
我建议您将函数复制到一个新文件中。让它们不是静态的。为他们制作一个头文件,并将其包含在您的 cpp 中。
我正在尝试将一些用 C 编写的函数包含到 C++ 项目中。我已经按照 these 的说明走了很远。 不幸的是,并非我需要调用的所有 C 函数都在 c header 文件中声明。有些只是在“.c-files”.
中定义的静态函数有没有办法仍然从我的 C++ 项目的 class 内部调用这样的 "non-declared-C-functions" 而无需更改 C 源代码(不是由我自己维护的)?
我已经考虑过在我的 C++ header 中自己向前声明 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-file" c_function(...)
也在其中声明。这意味着我需要在 c_function(...)
的前向声明之前包含 header 但显然这会使链接器监督定义。
一个非常简单的 C++ 代码版本大致如下: Header 文件 "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 文件)中声明为静态的函数在其他任何地方都无法访问,即使您转发声明了正确的函数签名。
乱七八糟的答案,不推荐:#include 有问题的 .c 文件到你的 .cpp 文件中,看看它是否有效。我会认为这是一个黑客虽然。实现文件包含的正是名称所暗示的:实现,而不是接口。这通常意味着您不应该知道它内部发生了什么,并且它可能会在不同版本之间发生变化。
如果你认识维护源代码的人,你也可以尝试联系他并询问他是否可以将函数作为 public 接口的一部分,即将它放在 header并使其成为 non-static.
我建议您将函数复制到一个新文件中。让它们不是静态的。为他们制作一个头文件,并将其包含在您的 cpp 中。