在stackoverflow上看到一个有趣的话题:如何给一个变量设置一个别名?(How to assign to a variable an alias?),所谓的变量别名,就是通过通过不同的标识符,来表示同一个变量。,我们知道,变量名称是给程序员使用的。,在编译器的眼中,所有的变量都变成了地址。,在上面这个帖子中,作者首先想到的是通过宏定义,对变量进行重新命名。,这样的做法,将会在编译之前的预处理环节,把宏标识符替换为变量标识符。,在网友回复的答案中,大部分都是通过指针来实现:让不同的标识符指向同一个变量。,不管怎么说,这也算是一种别名了。,但是,这些答案有一个局限:这些代码必须一起进行编译才可以,否则就可能出现无法找到符号的错误信息。,现在非常流行插件编程,如果开发者想在插件中通过一个变量别名来引用主程序中的变量,这该如何处理呢?,本文提供两个方法来实现这个目的,并通过两个简单的示例代码来进行演示。,之前我接触过一些CodeSys的代码,里面的代码质量真的是非常的高,特别是软件架构设计部分。,其中有个反向注册的想法,正好可以用在变量别名上面。,示例代码中一共有 2 个文件:main.c和plugin.c。,main.c中定义了一个全局变量数组,编译成可执行程序main。,plugin.c中通过一个别名来使用main.c中的全局变量。,plugin.c被编译成一个动态链接库,被可执行程序main动态加载(dlopen)。,在plugin.c中,提供一个函数func_init,当动态库被main dlopen之后,这个函数就被调用,并且把真正的全局变量的地址通过参数传入。,这样的话,在插件中就可以通过一个别名来使用真正的变量了(比如:修改变量的值)。,本质上,这仍然是通过指针来进行引用。,只不过利用动态注册的思想,把指针与变量的绑定关系在时间和空间上进行隔离。,编译指令如下:,执行结果:,可以看一下动态链接库的符号表:,可以看到alias_data标识符,并且是在本文件中定义的全局变量。,在动态加载的插件中使用变量别名,除了上面演示的动态注册的方式,还可以通过嵌入汇编代码来: 设置一个全局标号来实现。,直接上示例代码:,编译指令:,执行结果:,也来看一下libplugin.so中的符号信息:,这篇文档通过两个示例代码,讨论了如何在插件中(动态链接库),通过别名来访问真正的变量。,不知道您会不会有这样的疑问:直接使用extern来声明一下外部定义的变量不就可以了,何必这么麻烦?,道理是没错!,但是,在一些比较特殊的领域或场景中(比如一些二次开发中),这样的需求是的确存在的,而且是强需求。
© 版权声明
文章版权归作者所有,未经允许请勿转载。