想要实现的功能:动态库中定义结构体类型全局变量(一个结构体中嵌套多个结构体),该变量在库内可读写,但主程序(外部程序)只可读,不可写。
方便说明,简化成一个如下的结构体变量:
typedef struct
{
int a;
int b;
int c;
} Test_STU;
思路:
- 结构体改成类,public成员,通过get()方法获取——不喜欢,直接采用 . 结构体方式访问最好;
- 结构体改成类,public成员,添加const修饰——不喜欢,变量很多,初始化列表不方便,且类内以及其它类内无法修改变量,而且const并非完全保证变量不会被修改,比如const_cast;
- 对于让外部程序可读可写的全局变量,库内定义好一个对该变量的引用,如:
Test_STU&Test
,外部程序可通过extern &Test
声明后使用;那么类似,针对只读的变量,库内定义时候使用const &修饰,如const Test_STU & Test
,外部程序也通过extern &Test
声明后使用——测试不行,const属性只在本编译模块有效,外部程序依然可以通过Test.a
改写;
思考:本质上是想获取一个对某一片内存区域只有访问权限的指针!
思路:
联想多进程通信中的共享内存,在同一进程中使用shm_open
打开同一文件,通过mmap
建立两块内存映射区,获得操作该内存区域的指针,在建立映射区时,一个权限设为可读可写,一个权限设为只读……好像可以,试试……
动态库部分代码:
test.h
#ifndef TEST_H
#define TEST_H
#include "test_global.h"
#include <iostream>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
type