首页 > 解决方案 > 有没有办法从项目的主程序文件中设置对象成员数组大小,该文件#includes 用于声明/定义对象的.h 文件?

问题描述

对于上下文,我正在使用 c++ 在 stm32f ucontroller 上进行嵌入式音频并试图避免动态分配。

我编写的其中一个类是波表振荡器,在我的问题范围内,它本质上只是一堆 c 样式的数组。
我将这些文件以及其他文件放在与使用它们的特定项目不同的文件夹中,因此我可以跨项目重用它们而无需重写或复制/粘贴。

填充数组的值是在初始化例程期间计算的,而不是硬编码的,因此,如果我更改顶部的“#define tableLength 256”语句,将数组的大小从 256 设置为其他值,波形将下次我编译并将程序闪存到芯片上时会正确重新计算。

由于我正在使用有限的内存资源,一些使用这个波表振荡器的程序可能需要这些表的尺寸更小。

有没有办法从给定项目的主程序文件中指定这些数组的大小,以便在共享波表振荡器文件中不需要更改任何内容?

我的编程之旅还很早,但我的直觉告诉我必须有某种机制来完成这一点,因为数组的大小在编译时仍然是已知的?

我试图避免直接在共享文件中更改数组大小,因为自上次刷新以来被修改的任何文件都会在刷新过程中重新编译。
这意味着每次我需要更新不同的产品或处理不同的项目时,我都必须记住更改值。

对于进一步的上下文,我正在使用 makefile 构建和上传程序。
我对使用它们的了解非常少,所以也许有一种方法可以从项目的 makefile 中指定用于数组的大小?

谢谢您的帮助。

标签: c++arraysmakefile

解决方案


由于您c++在问题中包含标记并且c++语言包含模板,因此您可以参数化在 MAIN.cpp 文件中的另一个文件中声明的静态数组的大小,如下所示:

在 MYCLASS.cpp 中(在 MYCLASS.h 中声明)

template <unsigned int BYTES>
class CBase
{
public:
    char Arr[BYTES];

    int Fn1(void) {
        return Arr[1] ^ Arr[sizeof(Arr)-1];
    }

    int Fn2(void) {
        return Arr[2] ^ Arr[sizeof(Arr)-2];
    }
};

在 MAIN.cpp 中:

#include <stdio.h>
#include "MYCLASS.h"

int main(void)
{
    CBase<32> ddd;  //The number 32 causes the CBase to be instantiated with a 32-byte static array Arr[32].

    printf("%d\n", ddd.Fn1()); 
    printf("%d\n", ddd.Fn2());

    return (int)ddd.Arr[0];
}

32您可以使用 preprocesor代替 MAIN.cpp 中的数字,#define如果您愿意,可以从 makefile 中获取。

注意:如果您打算从CBase该类继承,那么请准备好遇到这个问题


推荐阅读