如何将 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 中。