0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么给全局变量起一个别名

汽车电子技术 来源:IOT物联网小镇 作者: 道哥 2023-02-14 13:38 次阅读

别名是啥玩意?

stackoverflow上看到一个有趣的话题:如何给一个变量设置一个别名?(How to assign to a variable an alias?

图片

所谓的变量别名,就是通过通过不同的标识符,来表示同一个变量。

我们知道,变量名称是给程序员使用的。

在编译器的眼中,所有的变量都变成了地址。

请注意:这里所讨论的别名,仅仅是通过不同的标识符来引用同一个变量。

与强符号、弱符号的概念没有任何关系,那是另一个话题。

在上面这个帖子中,作者首先想到的是通过宏定义,对变量进行重新命名。

这样的做法,将会在编译之前的预处理环节,把宏标识符替换为变量标识符。

在网友回复的答案中,大部分都是通过指针来实现:让不同的标识符指向同一个变量。

不管怎么说,这也算是一种别名了。

但是,这些答案有一个局限:这些代码必须一起进行编译才可以,否则就可能出现无法找到符号的错误信息

现在非常流行插件编程,如果开发者想在插件中通过一个变量别名来引用主程序中的变量,这该如何处理呢?

本文提供两个方法来实现这个目的,并通过两个简单的示例代码来进行演示。

文末有示例代码的下载地址。

方法1:反向注册

之前我接触过一些CodeSys的代码,里面的代码质量真的是非常的高,特别是软件架构设计部分。

传说:CodySys 是工控界的 Android

其中有个反向注册的想法,正好可以用在变量别名上面。

示例代码中一共有 2 个文件:main.cplugin.c

main.c中定义了一个全局变量数组,编译成可执行程序main

plugin.c中通过一个别名来使用main.c中的全局变量。

plugin.c被编译成一个动态链接库,被可执行程序main动态加载(dlopen)。

plugin.c中,提供一个函数func_init,当动态库被main dlopen之后,这个函数就被调用,并且把真正的全局变量的地址通过参数传入。

这样的话,在插件中就可以通过一个别名来使用真正的变量了(比如:修改变量的值)。

本质上,这仍然是通过指针来进行引用。

只不过利用动态注册的思想,把指针与变量的绑定关系在时间和空间上进行隔离。

plugin.c 源文件

#include 

int *alias_data = NULL;

void func_init(int *data)
{
	printf("libplugin.so: func_init is called. \\n");
	alias_data = data;
}

void func_stage1(void)
{
	printf("libplugin.so: func_stage1 is called. \\n");
	if (alias_data)
	{
		alias_data[0] = 100;
		alias_data[1] = 200;
	}
}

main.c 源文件

#include 
#include 
#include 	

// defined in libplugin.so
typedef void (*pfunc_init)(int *);
typedef void (*pfunc_stage1)(void);

int data[100] = { 0 };


void main(void)
{
	data[0] = 10;
	data[1] = 20;

	printf("data[0] = %d \\n", data[0]);
	printf("data[1] = %d \\n", data[1]);
	
	// open libplugin.so
	void *handle = dlopen("./libplugin.so", RTLD_NOW);
	if (!handle)
	{
		printf("dlopen failed. \\n");
		return;
	}

	// get and call init function in libplugin.so
	pfunc_init func_init =  (pfunc_init) dlsym(handle, "func_init");
	if (!func_init)
	{
		printf("get func_init failed. \\n");
		return;
	}
	func_init(data);

	// get and call routine function in libplugin.so
	pfunc_stage1 func_stage1 =  (pfunc_stage1) dlsym(handle, "func_stage1");
	if (!func_stage1)
	{
		printf("get func_stage1 failed. \\n");
		return;
	}
	func_stage1();

	printf("data[0] = %d \\n", data[0]);
	printf("data[1] = %d \\n", data[1]);

	return;
}

编译指令如下:

gcc -m32 -fPIC --shared plugin.c -o libplugin.so
gcc -m32 -o main main.c -ldl

执行结果:

data[0] = 10 
data[1] = 20 
libplugin.so: func_init is called. 
libplugin.so: func_stage1 is called. 
data[0] = 100 
data[1] = 200

可以看一下动态链接库的符号表:

readelf -s libplugin.so | grep data

图片

可以看到alias_data标识符,并且是在本文件中定义的全局变量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48624
  • 变量
    +关注

    关注

    0

    文章

    596

    浏览量

    28112
  • 标识符
    +关注

    关注

    0

    文章

    12

    浏览量

    7316
收藏 人收藏

    评论

    相关推荐

    labview中怎样将簇和全局变量连接在一起

    创建了全局变量,然后把才簇和全局变量连在一起
    发表于 05-24 22:59

    关于全局变量

    有使用全局变量的大神吗?解释下,使用队列全局变量传值,执行的结果为什么具有随机性(有时候能成功,有时候却不行)。
    发表于 11-15 23:27

    关于全局变量和功能全局变量的创建和使用

    的利弊了,只说自己的理解和使用方法。 首先说说全局变量全局变量可以在不同的VI之间传递数据,而与全局变量十分相似的局部变量则是用来在同一个
    发表于 01-25 20:58

    RAM的局部静态变量全局变量消耗

    因为在连接时,全局变量和局部静态变量都是在data区,所以在这里一起讨论了。在原文中自己的表述犯了
    发表于 11-03 08:54

    USART HMI全局变量作用域?

    在USART HMI中:在某页面中声明全局变量,并其赋值为a;在程序运行过程中将此全局变量
    发表于 10-09 21:00

    Labview之全局变量

    Labview之全局变量,很好的Labview资料,快来下载学习吧。
    发表于 04-19 10:56 0次下载

    从汇编代码访问C全局变量

    12.2 从汇编代码访问 C target=_blank style=cursor:pointer;color:#D05C38;text-decoration:underline;》C 全局变量
    发表于 10-19 09:25 0次下载

    教大家一个如何在头文件中定义全局变量的方法

    通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义在头文件里面会方便很多,那到底是如何实现的? os_var.c文件
    发表于 12-04 14:55 19次下载

    全局变量和局部变量有什么区别

    全局变量是编程术语中的一种,源自于变量之分。变量分为局部与全局,局部变量又可称之为内部变量。局部
    发表于 12-11 11:58 3.2w次阅读
    <b class='flag-5'>全局变量</b>和局部<b class='flag-5'>变量</b>有什么区别

    C51单片机中定义一个全局变量会有怎样的影响

    全局变量被定义在内存中的专门地址上,存储位置固定。对于频繁存取的重要变量但可以采用全局变量以减少代码的长度;由于全局变量总是占用内存,如果过多,或者把程序处理和计算中的一些中间
    发表于 11-02 16:38 7716次阅读

    在C语言中,全局变量滥用的后果是什么

    01 啥是全局变量 说起全局变量,就不得不提到全局变量,局部变量,静态全局变量,静态局部变量,这
    发表于 06-24 17:14 1497次阅读

    C语言中局部变量全局变量

    全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局
    的头像 发表于 10-15 10:48 5024次阅读

    如何给一个变量设置一个别名?

    在plugin.c中,提供一个函数func_init,当动态库被main dlopen之后,这个函数就被调用,并且把真正的全局变量的地址通过参数传入。
    的头像 发表于 06-06 09:33 1316次阅读

    用个简单demo实现对全局变量的管理

    在项目中基本都会遇到全局变量,随便放很容易忘记变量的使用,也不方便后续的阅读,就需要对全局变量进行统一管理,下面就用个简单demo,实现对全局变量的管理。
    的头像 发表于 11-10 11:01 739次阅读

    RTOS任务间通信为什么不用全局变量

    RTOS任务间通信为什么不用全局变量?原因在于使用全局变量存在诸多弊端。
    发表于 07-05 09:06 426次阅读