0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么給全局變量起一個(gè)別名

汽車(chē)電子技術(shù) ? 來(lái)源:IOT物聯(lián)網(wǎng)小鎮(zhèn) ? 作者: 道哥 ? 2023-02-14 13:38 ? 次閱讀

別名是啥玩意?

stackoverflow上看到一個(gè)有趣的話(huà)題:如何給一個(gè)變量設(shè)置一個(gè)別名?(How to assign to a variable an alias?

圖片

所謂的變量別名,就是通過(guò)通過(guò)不同的標(biāo)識(shí)符,來(lái)表示同一個(gè)變量。

我們知道,變量名稱(chēng)是給程序員使用的。

在編譯器的眼中,所有的變量都變成了地址。

請(qǐng)注意:這里所討論的別名,僅僅是通過(guò)不同的標(biāo)識(shí)符來(lái)引用同一個(gè)變量。

與強(qiáng)符號(hào)、弱符號(hào)的概念沒(méi)有任何關(guān)系,那是另一個(gè)話(huà)題。

在上面這個(gè)帖子中,作者首先想到的是通過(guò)宏定義,對(duì)變量進(jìn)行重新命名。

這樣的做法,將會(huì)在編譯之前的預(yù)處理環(huán)節(jié),把宏標(biāo)識(shí)符替換為變量標(biāo)識(shí)符。

在網(wǎng)友回復(fù)的答案中,大部分都是通過(guò)指針來(lái)實(shí)現(xiàn):讓不同的標(biāo)識(shí)符指向同一個(gè)變量。

不管怎么說(shuō),這也算是一種別名了。

但是,這些答案有一個(gè)局限:這些代碼必須一起進(jìn)行編譯才可以,否則就可能出現(xiàn)無(wú)法找到符號(hào)的錯(cuò)誤信息。

現(xiàn)在非常流行插件編程,如果開(kāi)發(fā)者想在插件中通過(guò)一個(gè)變量別名來(lái)引用主程序中的變量,這該如何處理呢?

本文提供兩個(gè)方法來(lái)實(shí)現(xiàn)這個(gè)目的,并通過(guò)兩個(gè)簡(jiǎn)單的示例代碼來(lái)進(jìn)行演示。

文末有示例代碼的下載地址。

方法1:反向注冊(cè)

之前我接觸過(guò)一些CodeSys的代碼,里面的代碼質(zhì)量真的是非常的高,特別是軟件架構(gòu)設(shè)計(jì)部分。

傳說(shuō):CodySys 是工控界的 Android

其中有個(gè)反向注冊(cè)的想法,正好可以用在變量別名上面。

示例代碼中一共有 2 個(gè)文件:main.cplugin.c。

main.c中定義了一個(gè)全局變量數(shù)組,編譯成可執(zhí)行程序main

plugin.c中通過(guò)一個(gè)別名來(lái)使用main.c中的全局變量。

plugin.c被編譯成一個(gè)動(dòng)態(tài)鏈接庫(kù),被可執(zhí)行程序main動(dòng)態(tài)加載(dlopen)。

plugin.c中,提供一個(gè)函數(shù)func_init,當(dāng)動(dòng)態(tài)庫(kù)被main dlopen之后,這個(gè)函數(shù)就被調(diào)用,并且把真正的全局變量的地址通過(guò)參數(shù)傳入。

這樣的話(huà),在插件中就可以通過(guò)一個(gè)別名來(lái)使用真正的變量了(比如:修改變量的值)。

本質(zhì)上,這仍然是通過(guò)指針來(lái)進(jìn)行引用。

只不過(guò)利用動(dòng)態(tài)注冊(cè)的思想,把指針與變量的綁定關(guān)系在時(shí)間和空間上進(jìn)行隔離。

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

執(zhí)行結(jié)果:

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

可以看一下動(dòng)態(tài)鏈接庫(kù)的符號(hào)表:

readelf -s libplugin.so | grep data

圖片

可以看到alias_data標(biāo)識(shí)符,并且是在本文件中定義的全局變量。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49015
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28306
  • 標(biāo)識(shí)符
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    7334
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于全局變量和功能全局變量的創(chuàng)建和使用

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

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

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

    Labview之全局變量

    Labview之全局變量,很好的Labview資料,快來(lái)下載學(xué)習(xí)吧。
    發(fā)表于 04-19 10:56 ?0次下載

    從匯編代碼訪(fǎng)問(wèn)C全局變量

    12.2 從匯編代碼訪(fǎng)問(wèn) C target=_blank style=cursor:pointer;color:#D05C38;text-decoration:underline;》C 全局變量
    發(fā)表于 10-19 09:25 ?0次下載

    教大家個(gè)如何在頭文件中定義全局變量的方法

    通常情況下,都是在C文件中定義全局變量,在頭文件中聲明,但是,如果我們定義的全局變量需要被很多的C文件使用的話(huà),那么將全局變量定義在頭文件里面會(huì)方便很多,那到底是如何實(shí)現(xiàn)的? os_var.c文件
    發(fā)表于 12-04 14:55 ?19次下載

    全局變量和局部變量有什么區(qū)別

    全局變量是編程術(shù)語(yǔ)中的種,源自于變量之分。變量分為局部與全局,局部變量又可稱(chēng)之為內(nèi)部
    發(fā)表于 12-11 11:58 ?3.2w次閱讀
    <b class='flag-5'>全局變量</b>和局部<b class='flag-5'>變量</b>有什么區(qū)別

    C51單片機(jī)中定義個(gè)全局變量會(huì)有怎樣的影響

    全局變量被定義在內(nèi)存中的專(zhuān)門(mén)地址上,存儲(chǔ)位置固定。對(duì)于頻繁存取的重要變量但可以采用全局變量以減少代碼的長(zhǎng)度;由于全局變量總是占用內(nèi)存,如果過(guò)多,或者把程序處理和計(jì)算中的
    發(fā)表于 11-02 16:38 ?8022次閱讀

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

    01 啥是全局變量 說(shuō)起全局變量,就不得不提到全局變量,局部變量,靜態(tài)全局變量,靜態(tài)局部變量,這
    發(fā)表于 06-24 17:14 ?1634次閱讀

    分析如何遠(yuǎn)離漫天飛舞的全局變量

    剛剛開(kāi)始用C或者其他面向?qū)ο缶幊陶Z(yǔ)言(比如C++)的小伙伴們,常常在個(gè)項(xiàng)目里為了圖省事,整了很多全局對(duì)象、全局變量滿(mǎn)天飛,這樣做其實(shí)是有很多弊端,本文來(lái)聊聊這個(gè)話(huà)題。 先談?wù)?/div>
    的頭像 發(fā)表于 09-15 13:49 ?1593次閱讀

    C語(yǔ)言中局部變量全局變量

    全局變量也稱(chēng)為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),它屬于個(gè)源程序文件。其作
    的頭像 發(fā)表于 10-15 10:48 ?5401次閱讀

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

    誰(shuí)調(diào)用了2.全局變量字節(jié)未對(duì)齊:有次調(diào)試的時(shí)候發(fā)現(xiàn)個(gè)變量定義成局部變量就能正常運(yùn)行,而定義成
    發(fā)表于 12-20 18:47 ?27次下載
    <b class='flag-5'>全局變量</b>被未知原因改變的解決方法

    如何個(gè)變量設(shè)置個(gè)別名?

    在plugin.c中,提供個(gè)函數(shù)func_init,當(dāng)動(dòng)態(tài)庫(kù)被main dlopen之后,這個(gè)函數(shù)就被調(diào)用,并且把真正的全局變量的地址通過(guò)參數(shù)傳入。
    的頭像 發(fā)表于 06-06 09:33 ?1562次閱讀

    個(gè)簡(jiǎn)單demo實(shí)現(xiàn)對(duì)全局變量的管理

    在項(xiàng)目中基本都會(huì)遇到全局變量,隨便放很容易忘記變量的使用,也不方便后續(xù)的閱讀,就需要對(duì)全局變量進(jìn)行統(tǒng)管理,下面就用個(gè)簡(jiǎn)單demo,實(shí)現(xiàn)對(duì)
    的頭像 發(fā)表于 11-10 11:01 ?937次閱讀

    RTOS任務(wù)間通信為什么不用全局變量?

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

    你是不是也沒(méi)躲過(guò)這個(gè)坑?用了太多全局變量......

    全局變量太多有哪些弊端?該如何規(guī)避,以及如何管理全局變量等。全局變量太多有哪些弊端?真正做過(guò)項(xiàng)目的同學(xué)應(yīng)該都能明白,項(xiàng)目中全局變量太多,
    的頭像 發(fā)表于 05-01 08:10 ?444次閱讀
    你是不是也沒(méi)躲過(guò)這個(gè)坑?用了太多<b class='flag-5'>全局變量</b>......