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



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

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

我有权对driver.h进行轻微修改,但不能修改driver.c
现在driver.c中定义了一些非常大的const数组,我想从testcode.c访问这些数组。
我本可以在driver.hriver.cestcode.c.

我想知道是否有其他方法/破解可以在这里使用,而不是复制数组定义。

参考下面的最小代码:

驱动程序.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_NAME1,  EE_TYPE3, EE_SETTING40},
},
...
...
{
{EE_NAME10,  EE_TYPE1, EE_SETTING30},
{EE_NAME10,  EE_TYPE2, EE_SETTING20},
{EE_NAME10,  EE_TYPE3, EE_SETTING40},
},
}

驱动程序.h

typedef enum{
EE_NAME1,
EE_NAME10,
}NAME_ENUM_e;
typedef enum{
EE_TYPE1,
EE_TYPE2,
EE_TYPE3,
}TYPE_ENUM_e;
typedef enum{
EE_SETTING20,
EE_SETTING30,
EE_SETTING40,
}SETTING_ENUM_e;

简单回答:如果不将typedef移动到标头中,就无法在保持类型一致性的同时做到这一点。复制定义的解决方案非常脆弱,因为当定义不同步时,它会导致未定义的行为。

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

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

最新更新