chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

如何給一個變量設置一個別名?

strongerHuang ? 來源:IOT物聯(lián)網(wǎng)小鎮(zhèn) ? 作者:IOT物聯(lián)網(wǎng)小鎮(zhèn) ? 2022-06-06 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

別名是啥玩意?

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

4eaada1e-e530-11ec-ba43-dac502259ad0.png

所謂的變量別名,就是通過通過不同的標識符,來表示同一個變量。

我們知道,變量名稱是給程序員使用的。

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

請注意:這里所討論的別名,僅僅是通過不同的標識符來引用同一個變量。

與強符號、弱符號的概念沒有任何關(guān)系,那是另一個話題。

在上面這個帖子中,作者首先想到的是通過宏定義,對變量進行重新命名。

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

在網(wǎng)友回復的答案中,大部分都是通過指針來實現(xiàn):讓不同的標識符指向同一個變量。

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

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

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

本文提供兩個方法來實現(xiàn)這個目的,并通過兩個簡單的示例代碼來進行演示。

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

方法1:反向注冊

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

傳說:CodySys 是工控界的 Android

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

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

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

plugin.c中通過一個別名來使用main.c中的全局變量。

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

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

這樣的話,在插件中就可以通過一個別名來使用真正的變量了(比如:修改變量的值)。

本質(zhì)上,這仍然是通過指針來進行引用。

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

plugin.c 源文件

#include 

int *alias_data = NULL;

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

void func_stage1(void)
{
printf("libplugin.so: func_stage1 is called. 
");
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 
", data[0]);
printf("data[1] = %d 
", data[1]);

// open libplugin.so
void *handle = dlopen("./libplugin.so", RTLD_NOW);
if (!handle)
{
printf("dlopen failed. 
");
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. 
");
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. 
");
return;
}
func_stage1();

printf("data[0] = %d 
", data[0]);
printf("data[1] = %d 
", 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

可以看一下動態(tài)鏈接庫的符號表:

readelf -s libplugin.so | grep data
4ee38580-e530-11ec-ba43-dac502259ad0.png

可以看到alias_data標識符,并且是在本文件中定義的全局變量。

方法2:嵌入?yún)R編代碼

在動態(tài)加載的插件中使用變量別名,除了上面演示的動態(tài)注冊的方式,還可以通過嵌入?yún)R編代碼來: 設置一個全局標號來實現(xiàn)。

直接上示例代碼:

plugin.c源文件

#include 

asm(".Global alias_data");
asm("alias_data = data");

extern int alias_data[];

void func_stage1(void)
{
printf("libplugin.so: func_stage1 is called. 
");

*(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 
", data[0]);
printf("data[1] = %d 
", data[1]);

// open libplugin.so
void *handle = dlopen("./libplugin.so", RTLD_NOW);
if (!handle)
{
printf("dlopen failed. 
");
return;
}

// 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. 
");
return;
}
func_stage1();

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

return;
}

編譯指令:

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

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

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

也來看一下libplugin.so中的符號信息:

readelf -s libplugin.so | grep data
4f4798ea-e530-11ec-ba43-dac502259ad0.png

小結(jié)

這篇文檔通過兩個示例代碼,討論了如何在插件中(動態(tài)鏈接庫),通過別名來訪問真正的變量。

不知道您會不會有這樣的疑問:直接使用extern來聲明一下外部定義的變量不就可以了,何必這么麻煩?

道理是沒錯!

但是,在一些比較特殊的領域或場景中(比如一些二次開發(fā)中),這樣的需求是的確存在的,而且是強需求。

審核編輯 :李倩


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

    關(guān)注

    3

    文章

    4416

    瀏覽量

    67440
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4965

    瀏覽量

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

    關(guān)注

    0

    文章

    615

    瀏覽量

    29485

原文標題:如何給全局變量起一個別名?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    小藝開放平臺鴻蒙智能體開發(fā)智能體配置-基礎信息

    描述,描述會直接顯示在智能體的詳情頁內(nèi)展示用戶查看。 智能體別名:用于智能體分發(fā),提高分發(fā)準確率,支持配置多個別名。 本文參考鴻蒙官方文檔
    發(fā)表于 02-02 16:47

    傳遞無符號的 long 型指針函數(shù)

    C語言允許傳遞指針函數(shù),只需要簡單地聲明函數(shù)參數(shù)為指針類型即可。 下面的實例中,我們傳遞無符號的 long 型指針函數(shù),并在函數(shù)內(nèi)改變這個值: 實例 #include #i
    發(fā)表于 01-27 11:51

    使用博圖(TIA Portal)監(jiān)控PROFINET從站通訊狀態(tài)的兩方法

    。在數(shù)據(jù)塊中定義array of bool類型的變量(如state),長度根據(jù)從站數(shù)量確定(通常為1024位)。 調(diào)用DeviceStates指令 在OB1或其他循環(huán)組織塊中,調(diào)用
    的頭像 發(fā)表于 01-17 11:21 ?1195次閱讀
    使用博圖(TIA Portal)監(jiān)控PROFINET從站通訊狀態(tài)的兩<b class='flag-5'>個</b>方法

    智能顯示模塊怎么在顯示工程中寄存器設置初始值?我想變量上電的默認值該如何設置

    智能顯示模塊怎么在顯示工程中寄存器設置初始值?我想變量上電的默認值該如何
    發(fā)表于 12-11 09:54

    typedef結(jié)構(gòu)體使用

    ) { DATE* date; ... } 甚至還可以順便給它的指針也定義個別名: typedef struct date { int year; int month; int day; } DATE, *PDATE;
    發(fā)表于 12-08 07:04

    智能顯示模塊怎么在顯示工程中寄存器設置初始值?我想變量上電的默認值該如何設置?

    智能顯示模塊怎么在顯示工程中寄存器設置初始值?我想變量上電的默認值該如何
    發(fā)表于 12-06 10:20

    常用變量的介紹

    寄存器變量,般較短的變量類型適合定義為寄存器變量,如short、char等; auto:c語言變量缺省存儲類型就是auto typedef
    發(fā)表于 11-21 07:05

    Java同仁單點的AI&quot;開胃菜&quot;--搭建自己的本地問答系統(tǒng)

    這是我參與創(chuàng)作者計劃的第1篇文章 大家好,因為對AI大模型很感興趣,相信很多兄弟們跟我樣,所以最近花時間了解了些,有些總結(jié) 分享大家,希望對各位有所幫助; 本文主要是目標是 講
    的頭像 發(fā)表于 11-03 17:16 ?591次閱讀
    <b class='flag-5'>給</b>Java同仁單點的AI&quot;開胃菜&quot;--搭建<b class='flag-5'>一</b><b class='flag-5'>個</b>自己的本地問答系統(tǒng)

    PLC中Static和Temp變量的區(qū)別

    大家好,收到粉絲投稿,讓博主講下Static變量和Temp變量的區(qū)別,新入行的兄弟可能會對這兩概念不太能理解。
    的頭像 發(fā)表于 09-24 14:51 ?1378次閱讀
    PLC中Static和Temp<b class='flag-5'>變量</b>的區(qū)別

    rt-thread studio怎么設置才能讓char變量是真正的有符號類型?

    最近被bug折磨了3天,路debug進來,發(fā)現(xiàn)最終的原因是,定義了char變量,但實際
    發(fā)表于 09-16 08:23

    【原創(chuàng)】TDMS設置一個寫入位置函數(shù)的摸索

    開時,必須啟用緩沖 3、必須先調(diào)用“tdms設置一個寫入位置”再調(diào)用高級tdms寫入函數(shù) 4、寫入函數(shù)完成后,必須使用高級tdms關(guān)閉,利用刷新是無用的 5、高級tdms打開函數(shù),生成的tdms引用放入全局變量,然后在其他vi
    發(fā)表于 08-11 20:54

    AI玩具或成為下一個萬億新賽道

    如果你將擁有家庭新成員,你首先會想到什么?是孩子還是寵物?如果我說你下一個家庭成員,或許是會“察言觀色”的AI玩具,這件事是不是聽上
    的頭像 發(fā)表于 07-29 10:15 ?1093次閱讀

    如何打造屬于自己的手勢識別應用

    期小編大家介紹了和MediaPipe的相遇之路,本期小編將帶著大家起來動手,如何打造屬于自己的手勢識別應用。
    的頭像 發(fā)表于 07-29 10:12 ?1134次閱讀
    如何打造<b class='flag-5'>一</b><b class='flag-5'>個</b>屬于自己的手勢識別應用

    Keysight是德示波器的5觸發(fā)設置與波形分析方法

    Keysight是德示波器在電子測量領域應用廣泛,精準的觸發(fā)設置與高效的波形分析方法對獲取準確信號信息至關(guān)重要。以下為您介紹5常用的觸發(fā)設置及波形分析方法。 ? 邊沿觸發(fā)設置? 邊沿
    的頭像 發(fā)表于 06-27 16:00 ?1385次閱讀
    Keysight是德示波器的5<b class='flag-5'>個</b>觸發(fā)<b class='flag-5'>設置</b>與波形分析方法

    關(guān)于STM32 CAN通信發(fā)送函數(shù)HAL_CAN_AddTxMessage()的最后參數(shù)填0和定義變量取地址的問題求解

    問題: 關(guān)于STM32 CAN通信 發(fā)送函數(shù) HAL_CAN_AddTxMessage()的最后參數(shù)填0和定義變量取地址的問題,如果
    發(fā)表于 03-11 08:22