访问其typedef也定义在外部的外部数组

问题描述

我正在编写代码( testcode.c )来测试一组API。文件夹结构如下所示。

/folder  
|  
|-- driver.c  
|-- driver.h  
|-- testcode.c

我有权对 driver.h 进行一些修改,但不能修改 driver.c
现在 driver.c 中定义了一些非常大的const数组,我想从 testcode.c 中访问这些数组。
我本来会在 driver.h 中使用extern declecle,但是数组类型也是在 driver.c 本身中定义的。 现在,我将所有const数组都复制到了 testcode.c

我想知道是否可以在这里使用其他替代方法/技巧来代替复制数组定义。

请参阅下面的最少代码:

driver.c

typedef struct{
  NAME_ENUM_e      name;
  TYPE_ENUM_e      type;
  SETTING_ENUM_e   setting;
}SETTINGS_t;

const SETTINGS_t sValueArr[LARGE_NUMBER][3] =    /* <-- I want to use this array in testcode.c */
{
   {
     {EE_NAME1,EE_TYPE1,EE_SETTING20},{EE_NAME1,EE_TYPE2,EE_SETTING30},EE_TYPE3,EE_SETTING40},},...
    ...
   {
     {EE_NAME10,{EE_NAME10,}

driver.h

typedef enum{
    EE_NAME1,EE_NAME10,}NAME_ENUM_e;

typedef enum{
    EE_TYPE1,}TYPE_ENUM_e;

typedef enum{
    EE_SETTING20,EE_SETTING30,EE_SETTING40,}SETTING_ENUM_e;

解决方法

简短的回答:在不将typedef移入标题的情况下保持类型一致性的同时,无法做到这一点。复制定义的解决方案非常脆弱,因为当定义不同步时,它将导致未定义的行为。

长答案:假设driver.c的作者没有将typedef放在标题中是有意的,他们这样做的原因是要隐藏其常量。他们想要自由地更改项目的数量,数组的结构,用完全不同的东西替换它,甚至完全删除它。

理想情况下,您的代码根本不需要访问这些常量。如果您的测试代码必须依赖driver.h中的常量,那么将它们设为私有的决定可能是一个错误。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...