0

我正在尝试将一些用 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].

作为第三个参数传递给 struct 的指针c_function(int*, const unsigned char, const some_c_struct*)似乎让事情变得更加棘手,因为该类型some_c_struct是在属于“.c-file”的标头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);
}
4

2 回答 2

1

干净的答案:不。在翻译单元(通常是 .c 或 .cpp 文件)中声明为静态的函数在其他任何地方都无法访问,即使您转发声明了正确的函数签名。

凌乱的答案,不推荐:#include 有问题的 .c 文件到你的 .cpp 文件中,看看它是否有效。我会认为这是一个黑客。实现文件包含名称所暗示的内容:实现,而不是接口。这通常意味着您不应该知道它内部发生了什么,并且它可能会在版本之间发生变化。

如果您认识维护源代码的人,您也可以尝试联系他并询问他是否可以将该功能作为公共接口的一部分,即将其放在标题中并使其成为非静态的。

于 2016-08-21T07:47:23.587 回答
0

我建议您将这些函数复制到一个新文件中。使它们不是静态的。为它们制作一个头文件,并将其包含在您的 cpp.xml 中。

于 2016-08-21T07:58:00.970 回答