两个C库如何共享静态缓冲区?

介绍

我正在开发我的第一个嵌入式应用程序(在Arduino上),它从一些现成组件中获取输入并控制它们.这是一个完全私人的非商业项目. (为了我自己的利益,只需要一点乐趣/训练.)

Arduino库只是C源代码的压缩集合,带有一个C和.h文件,用于显示库的接口.出于这个问题的目的,只考虑每个库作为我从其他人那里获得的源的集合.

可以使用免费提供的库(具有良好的声誉)来控制两个更复杂的组件,我希望使用它们来避免重新发明轮子.但是,两个库都声明了许多数组,这些数组消耗了太多可用的非常有限的数据空间.

在启动时,我的应用程序将测试一个开关,该开关将确定在下一个电源循环之前将使用哪两个组件.我永远不会同时使用这两个组件.

我的问题是什么?

我想更改库以在RAM中共享相同的空间但我发现我对C的知识太有限了.

现有代码是什么样的?

库A声明缓冲区如下:

class A
{
 public:
    char name[50];
    char address[100];
}

库B声明缓冲区如下:

class B
{
 public: 
    static char name[];
    static char address[];
}

并且B的调用者需要按如下方式定义缓冲区:

    char B::name[50];
    char B::address[100];

可能的选择

我可以轻松地对库A进行少量更改,以传入指向我的应用程序定义的缓冲区的指针.但是,库B比较棘手,因为缓冲区被声明为静态并被许多静态方法使用.

我可以更改库B以将使用这些缓冲区的所有静态方法转换为非静态方法.但这将是重要的工作,并且偏离原来的更多我想要的.如果我想要一天,这样的更改将使我更难以更新我的应用程序以使用原始作者的更高版本的库.

我假设我可以将B:name []和B :: address []的地址传递给库A,但是将类B的缓冲区传递给A类感觉就像一个粗略的小屋.

鉴于硬件上下文,我不介意定义一个足够大的名称和地址的大缓冲区,然后使用库中缓冲区的偏移量.但我的主要问题阻止我在图书馆B中这样做.

总之,我的问题是我不能让两个库共享一个完全在两个类之外定义的缓冲区而不更改库B,因此它不使用静态方法.

任何人都可以提出任何语言技巧来解决我的问题,无论是适度数量的代码更改还是可以自动或使用宏进行的更改?

最佳答案 不太确定您感觉良好的变化程度.

但是如何只更改B类的头和应用程序,让其余的实现完好无损?

class B
{
 public: 
    static char* name;
    static char* address;
}

B的调用者定义缓冲区如下:

char name[50];
char address[100];
char* B::name = name;
char* B::address = address;

然后,您还可以按计划将姓名和地址传递给A班.

所以问题是:为什么这对B中的其他代码起作用?

首先,它需要使用相同的头编译.
除此之外,鉴于它实际上无法直接查看数组的大小,它将或多或少地正常工作而无需进一步更改.

可能存在问题的地方是它是否包含期望数组参数但不包含指针的方法或函数.数组衰减到指针但不是相反.
如果是这种情况,您还必须将参数更改为这些功能.

但是,鉴于首先存在单例模式和静态成员,我打赌这个问题不存在.

点赞