色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    1623

    瀏覽量

    49108
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28360
  • 標識符
    +關注

    關注

    0

    文章

    12

    瀏覽量

    7339
收藏 人收藏

    評論

    相關推薦

    關于全局變量和功能全局變量的創建和使用

    的利弊了,只說自己的理解和使用方法。 首先說說全局變量全局變量可以在不同的VI之間傳遞數據,而與全局變量十分相似的局部變量則是用來在同一個
    發表于 01-25 20:58

    static作用(修飾函數、局部變量全局變量

    詳細介紹了static作用(修飾函數、局部變量全局變量)的用法
    發表于 11-17 10:30 ?4次下載

    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.3w次閱讀
    <b class='flag-5'>全局變量</b>和局部<b class='flag-5'>變量</b>有什么區別

    C51單片機中定義全局變量會有怎樣的影響

    全局變量被定義在內存中的專門地址上,存儲位置固定。對于頻繁存取的重要變量但可以采用全局變量以減少代碼的長度;由于全局變量總是占用內存,如果過多,或者把程序處理和計算中的
    發表于 11-02 16:38 ?8080次閱讀

    在C語言中,全局變量濫用的后果是什么

    01 啥是全局變量 說起全局變量,就不得不提到全局變量,局部變量,靜態全局變量,靜態局部變量,這
    發表于 06-24 17:14 ?1654次閱讀

    分析如何遠離漫天飛舞的全局變量

    剛剛開始用C或者其他面向對象編程語言(比如C++)的小伙伴們,常常在項目里為了圖省事,整了很多全局對象、全局變量滿天飛,這樣做其實是有很多弊端,本文來聊聊這個話題。 先談談
    的頭像 發表于 09-15 13:49 ?1636次閱讀

    C語言中局部變量全局變量

    全局變量也稱為外部變量,它是在函數外部定義的變量。它不屬于哪一個函數,它屬于源程序文件。其作
    的頭像 發表于 10-15 10:48 ?5522次閱讀

    全局變量被未知原因改變的解決方法

    誰調用了2.全局變量字節未對齊:有次調試的時候發現變量定義成局部變量就能正常運行,而定義成
    發表于 12-20 18:47 ?27次下載
    <b class='flag-5'>全局變量</b>被未知原因改變的解決方法

    如何變量設置個別名?

    在plugin.c中,提供函數func_init,當動態庫被main dlopen之后,這個函數就被調用,并且把真正的全局變量的地址通過參數傳入。
    的頭像 發表于 06-06 09:33 ?1611次閱讀

    簡單demo實現對全局變量的管理

    在項目中基本都會遇到全局變量,隨便放很容易忘記變量的使用,也不方便后續的閱讀,就需要對全局變量進行統管理,下面就用簡單demo,實現對
    的頭像 發表于 11-10 11:01 ?963次閱讀

    RTOS任務間通信為什么不用全局變量

    RTOS任務間通信為什么不用全局變量?原因在于使用全局變量存在諸多弊端。
    發表于 07-05 09:06 ?819次閱讀

    你是不是也沒躲過這個坑?用了太多全局變量......

    全局變量太多有哪些弊端?該如何規避,以及如何管理全局變量等。全局變量太多有哪些弊端?真正做過項目的同學應該都能明白,項目中全局變量太多,
    的頭像 發表于 05-01 08:10 ?524次閱讀
    你是不是也沒躲過這個坑?用了太多<b class='flag-5'>全局變量</b>......
    主站蜘蛛池模板: 国内精品日本久久久久影院| 中文字幕在线播放视频| 九九精品久久| 在线观看视频一区| 男女边吃奶边做边爱视频| WWW久久只有这里有精品| 日美欧韩一区二去三区| 国产精品毛片在线视频| 亚洲精品无码不卡在线播放he | 女仆翻身大作战| 床伴在线观看免费高清完整泰剧第四集| 色欲档案之麻雀台上淫| 国产网红主播精品福利大秀专区| 一级am片欧美| 女人精69xxxxx舒心| 俄罗斯女人Z0Z0极品| 亚洲成人免费在线观看| 久久久久亚洲精品影视| bt成人种子| 无码欧美毛片一区二区三在线视频 | 欧美人与动牲交XXXXBBBB免费| 被黑人群jian又粗又大H| 吸奶舔下面| 久久视频精品3线视频在线观看| 99久久久精品免费观看国产| 色WWW永久免费视频首页| 黑人猛挺进小莹的体内视频| 最新国产在线视频在线| 肉动漫h黄动漫日本免费观看| 国产亚洲免费观看| 90后美女乳沟| 色综合久久久久久| 久久精品WWW人人爽人人| CHINESE熟女老女人HD视频| 香蕉eeww99国产精选播放| 久久综合电影| 公么我好爽再深一点| 一级毛片全部免| 日本亚欧热亚洲乱色视频| 交换:年轻夫妇-HD中文字幕| 99久久亚洲|