【问题标题】:How to make a C "library" that can be reused in different code bases?如何制作可以在不同代码库中重用的 C“库”?
【发布时间】:2020-02-06 20:52:49
【问题描述】:

我正在为学校开发一个项目,我认为我们可以在两个不同的项目中使用相同的代码。该代码实质上连接到在主机上运行的套接字,该套接字正在运行提供流量数据(x,y 位置)的模拟器。这些位置被解析成一个结构体:

struct Vehicle{
    Double x;
    Double y;
    int id;
    int type;
}

这些结构的列表将返回给实例化库的程序。所以我想使用这段代码,我必须解析数据并有一个通用方法,可以在每个事件之后(大约每 1 毫秒)将结构传递回调用者。我该怎么做呢?

更新:

我不清楚的部分是让库每隔x 秒获取一次数据,然后让它将该数据传递给另一个相应更新的文件。因此,如果fileA 是绘制位置的代码并且fileB 处理将数据解析到结构中,我将如何通过从fileB 传回数据来更新fileA 中的方法中的画布(相反调用fileB中的一些方法来获取数据)。

【问题讨论】:

  • 您到底有什么不清楚的地方?您将代码编译到共享库中并在头文件中定义 api(公共函数和结构),您将其包含在使用共享库中的函数的源文件中。
  • 创建一个 .c 文件,其中包含一组函数来完成这项工作,并创建一个对应的 .h 文件,其中包含函数原型以及任何必要的 struct 定义。
  • 在帖子末尾发布了更新@Ctx
  • @Citut 这与单独的源文件关系不大,而与多线程和同步有关。
  • 那个语法不是 C。

标签: c shared-libraries


【解决方案1】:

如何通过传递数据来更新 fileA 中的方法中的画布 从 fileB 返回(而不是调用 fileB 中的某些方法来获取 数据)。

每次fileB中的数据准备好后,fileB中的代码需要调用fileA中的一个方法,并通过调用的方法将数据传递给fileA。

调用的 fileA 方法可以是硬编码的(总是相同的),或者在启动时 fileA 中的代码可以调用 fileB 方法,传递数据准备好时 fileB 应该调用的函数 - 这称为“注册回调”

我不确定您将如何在 C 中做到这一点(自从我使用该语言多年以来)。在 C++ 中它是相当标准的,如下所示:

#include <iostream>
#include <functional>
#include <thread>         // std::this_thread::sleep_for
#include <chrono>         // std::chrono::seconds

using namespace std;

class B;

class A
{
public:

    // function that should be called when data is ready
    void Callback();

    void Register( B& theB );
};

class B
{
public:
    void RegisterCallback( function<void(void)> f );

    // method that runs whenever new data is ready
    void SendDataToA();

    function<void(void)> myCallback;
};

void A::Register( B& theB )
{
    theB.RegisterCallback( [this]()
    {
        Callback();
    } );
}

void A::Callback()
{
    // B has sent some data
    cout << "A::Callback\n";
}

void B::RegisterCallback( function<void(void)> f )
{
    myCallback = f;
}

void B::SendDataToA()
{
    while( 1 ) {
        std::this_thread::sleep_for (std::chrono::seconds(1));

        // data is ready, send it to A
        myCallback();
    }
}

int main()
{
    A theA;
    B theB;

    // register A's callback with B
    theA.Register( theB );

    // run B's data pump
    theB.SendDataToA();

    return 0;
}

【讨论】:

  • 我对回调很熟悉,但我不知道如何在C中使用它们。它类似于Objective-C/Swift/更高级别的语言吗?
  • 建议你使用 C++。像这样复杂的东西要容易得多。
猜你喜欢
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多