之前做嵌入式车载项目的时候,看到过udev的代码,其中有结构体私有化的方法。
今天做cableModel项目的时候,编译openssl遇到个问题:
error: dereferencing pointer to incomplete type 'X509' {aka 'struct x509_st'}
当时没有意识到openssl已经将结构体X509的实现屏蔽掉,也就是结构体私有化;于是我看了很多博客上面说的都是struct没有定义。
其实不是struct的变量未定义,而是openssl的X509结构体被类似于C++的封装,私有化了。让我们无法直接访问其成员:
x509->cert_info->validity->notAfter
而访问notAfter成员的方法已经被封装成:
X509_get0_notAfter(x509)
即使我在代码中加上typedef struct x509_st X509也不能访问X509.h中的 struct x509_st。因为整个结构体的实现是在 对应的c文件中实现的x509.c。
参考百度文库
C语言结构体变量私有化 - 百度文库 (baidu.com)中的方法,我们可以在以后的C代码中也实现成员变量的“私有化”。原理很简单:
1.h头文件中声明你想构造的结构体:
struct sample;
2.c文件中实现结构体定义:
struct sample{
int aid;
...
}
3.为了访问samle的变量aid,则在.h中加入int getAid(const struct sample* t);函数声明作为你引入.h文件的接口;
4.c文件实现
int getAid(const struct sample* t)
{
return t->aid;
}
这样我们的结构体变量就被“私有化”了。
不明所以的人可能就会像我刚才一样,掉坑。此坑我已见过两次,udev与openssl。在此标记。