阵列外部链接和 MISRA 8.12

Array external linkage and MISRA 8.12

我有一个程序需要根据语言 ID 将字体加载到显示器中。

我想要一个包含用于写入字体数据的属性的结构:

typedef struct Font_Data_Metrics_s
{
    uint8_t const * font_data_start;
    size_t          font_data_length;
    unsigned int    language_id;
} Font_Data_Metrics_t;

字体数据在单独的文件中,每个文件一种字体。
示例:
Russian_Font_Data.c:

uint8_t const Russian_Font_Data[] =
{
  // the data
};
const size_t Size_Russian_Font_Data =
    sizeof(Russian_Font_Data) / sizeof(Russian_Font_Data[0]);

理想情况下,我想使用(Russian_Font_Data.c 之外):

const static Font_Data_Metrics_t russian_metrics =
{
  Russian_Font_Data,       // This field is the annoying issue.
  Size_Fussion_Font_Data,
  6, // Russian language ID
};

这是我试过的方法:
(1) extern uint8_t const Russian_Font_Data[];
错误:当使用外部链接声明数组时,其大小应明确说明或通过初始化隐式定义(MISRA C 2004 规则 8.12)

(2) extern uint8_t const * Russian_Font_Data;
错误:声明与“uint8_t const * Russian_Font_Data”

不兼容

(3) uint8_t const font_data_start[];(结构内部)。
在结构内部时格式不正确。

如何将具有外部链接的数组地址放入结构中?
(最好没有 烦人的 MISRA 违规行为)

编辑 1:背景/用法
我想要超过 12 种字体的 table 指标。 table 将按语言 ID 搜索。字体数据开始和字体数据长度将被传递给将数据写入硬件显示设备的函数。项目中的其他代码将根据操作员的选择设置语言 ID。

目前,我有一个 table 是在 运行 时间内通过调用“数据”函数构建的。这很混乱,我需要为每种字体使用“getter”函数。我的objective是有一个常量数据的table,可以放在数据段直接访问(也就是在程序启动前准备好访问)。

也许您可以在同一个 .c 文件中定义规格和字体数据:

在Russian_Font_Data.c中:

#include "Font_Data_Metrics.h"

const static uint8_t Russian_Font_Data[] =
{
  // the data
};

const Font_Data_Metrics_t russian_metrics =
{
  .font_data_start = Russian_Font_Data,
  .font_data_length = sizeof Russian_Font_Data / sizeof Russian_Font_Data[0],
  .language_id = 6, // Russian language ID
};

在一些头文件中:

#include "Font_Data_Metrics.h"

extern const Font_Data_Metrics_t russian_metrics;