问题描述
我正在编写代码( 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
中的常量,那么将它们设为私有的决定可能是一个错误。