我目前对 C 结构信息隐藏的概念有点困惑。
这道题的背景是一个嵌入式c项目,对OOP的了解几乎为零。
到目前为止,我总是在相应模块的头文件中声明我的 typedef 结构。因此每个想要使用该结构的模块都知道该结构类型。
但经过 MISRA-C 检查后,我发现了中等严重性警告:MISRAC2012-Dir-4.8 - 结构的实现不必要地暴露给翻译单元。
经过一番研究后,我通过限制结构成员对私有范围的可见访问,发现了 C 结构信息隐藏的概念。
我立即尝试了一个简单的例子,如下所示:
struct_test.h
//struct _structName;
typedef struct _structName structType_t;
Run Code Online (Sandbox Code Playgroud)
struct_test.c
#include "struct_test.h"
typedef struct _structName
{
int varA;
int varB;
char varC;
}structType_t;
Run Code Online (Sandbox Code Playgroud)
主程序
#include "struct_test.h"
structType_t myTest;
myTest.varA = 0;
myTest.varB = 1;
myTest.varC = 'c';
Run Code Online (Sandbox Code Playgroud)
这会产生编译器错误,即对于 main.c,myTest 的大小未知。当然是这样,main.c 只知道 structType_t 类型的结构存在,而没有其他信息。
所以我继续研究并偶然发现了不透明指针的概念。
所以我尝试了第二次尝试:
struct_test.h
typedef struct _structName *myStruct_t;
Run Code Online (Sandbox Code Playgroud)
struct_test.c
#include "struct_test.h"
typedef struct _structName
{
int varA;
int varB;
char varC;
}structType_t;
Run Code Online (Sandbox Code Playgroud)
主程序
#include …
Run Code Online (Sandbox Code Playgroud)