程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配

程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配

ID:13381041

大小:123.50 KB

頁(yè)數(shù):12頁(yè)

時(shí)間:2018-07-22

程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配_第1頁(yè)
程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配_第2頁(yè)
程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配_第3頁(yè)
程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配_第4頁(yè)
程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配_第5頁(yè)
資源描述:

《程序app鏈接b庫(kù)時(shí),如何解決枚舉值不匹配》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。

1、情況是這樣的:App程序只提供了部分代碼,B庫(kù)有全部代碼。B庫(kù)的代碼需要用到App里面定義的一些枚舉量,現(xiàn)在需要將B庫(kù)鏈接到App里。由于枚舉量的定義中使用了編譯開(kāi)關(guān)來(lái)控制,而App具體打開(kāi)了哪些開(kāi)關(guān)未知,從而導(dǎo)致B庫(kù)中如果直接#includeApp使用的頭文件所得到的枚舉值與App里面運(yùn)行時(shí)所得到的枚舉值不匹配。還是寫(xiě)個(gè)Demo程序來(lái)說(shuō)吧,App的代碼是這樣的,首先是App.h這個(gè)雙方都要用的頭文件如下:#ifndefAPP_H#defineAPP_H/*ValueofID_EiscontrolledbyswitchSWITCH_ID_CDIfSWITCH_ID_CDisenabled,ID

2、_E=4,IfSWITCH_ID_CDisdisabled,ID_E=2.*/typedefenumt_ID{ID_A=0,ID_B,#ifdefSWITCH_ID_CDID_C,ID_D,#endifID_E,ID_F}ID;#endif可以看到如果編譯開(kāi)關(guān)?SWITCH_ID_CD打開(kāi),則ID_E=4,否則?ID_E=2。BLib的代碼BLib.c如下:#defineBLIB_Chttp://biao.qqlove789.com/*App.hisfromApp,andwehavenoideaofSWITCH_ID_CDisswitchedonoroff*/#include"../App/A

3、pp.h"/*Getvalueofid*/intget_id_value(IDid){return(int)id;}http://weimei.wan128.cn/*Itwillreturn2becauseSWITCH_ID_CDnotdefinedinthislib*/intget_ID_E(){returnget_id_value(ID_E);}BLib.c并沒(méi)有打開(kāi)編譯開(kāi)關(guān)SWITCH_ID_CD,那么當(dāng)App調(diào)用BLib的函數(shù)?get_ID_E()時(shí),將會(huì)返回2。App的主程序App.c如下:/*LinkBLib.libinApp*/#pragmacomment(lib,"../Deb

4、ug/BLib.lib")/*WeswitchonSWITCH_ID_CDinApp,anddisableitinBLib.lib*/#defineSWITCH_ID_CD#include"stdio.h"#include"App.h"/*FunctionsfromBLib.lib*/externintget_id_value(IDid);externintget_ID_E();intmain(intargc,char*argv[]){printf("-----InApp-----");printf("ID_E=%d.",(int)ID_E);//此處會(huì)返回4printf("-

5、----InBLib.lib-----");printf("ID_E=%d.(callget_ID_E())",get_ID_E());//此處會(huì)返回2getchar();return0;}App.c打開(kāi)了編譯開(kāi)關(guān)SWITCH_ID_CD,所以當(dāng)App顯示ID_E的值時(shí),將會(huì)返回4。運(yùn)行的結(jié)果也驗(yàn)證了這一點(diǎn)。-----InApp-----ID_E=4.-----InBLib.lib-----ID_E=2.(callget_ID_E())上面的不匹配就是遇到的問(wèn)題,怎么解決它呢?曾經(jīng)考慮過(guò)幾個(gè)方案:方案1:直接Hack出枚舉值的數(shù)值,然后在BLib.c中使用之方案2:使用字符串到數(shù)值的譯

6、碼方式匹配枚舉值方案3:使用extern方式引用外部變量?下面分別論述其可行性。方案1:直接Hack出枚舉值的數(shù)值,然后在BLib.c中使用之這種方法最簡(jiǎn)單粗暴,既然無(wú)法確認(rèn)App使用了哪些編譯開(kāi)關(guān),那就通過(guò)debug的方式將App.h中定義的枚舉量的具體數(shù)值直接打印出來(lái),然后在BLib.c中使用。但是這種硬編碼的方式其擴(kuò)展性也最差,一旦App的編譯開(kāi)關(guān)發(fā)生變化,其枚舉量勢(shì)必會(huì)跟著變化,這時(shí)再手工修改BLib.c就成了苦差事。本方法僅適合于快速調(diào)試等短線投資,不適合長(zhǎng)線持有。?方案2:使用字符串到數(shù)值的譯碼方式匹配枚舉值這種方法實(shí)現(xiàn)方式就是在BLib.c里新建一個(gè)函數(shù),向其傳入“ID_E”這個(gè)

7、字符串,然后該函數(shù)調(diào)用App里面的解析函數(shù),將這個(gè)字符串匹配到實(shí)際的ID_E的數(shù)值并返回。聽(tīng)上去稍微優(yōu)雅一些,但是問(wèn)題也不少,比方說(shuō)對(duì)于這些字符串的解析過(guò)程,將來(lái)枚舉量增加的話(目前項(xiàng)目的枚舉量在上千個(gè)左右),還用一堆的ifelse來(lái)線性挨個(gè)比較顯然效率不高,可如果用HashTable做快速映射則勢(shì)必增加代碼量,更別說(shuō)存儲(chǔ)這些字符串及哈希值需要占用的存儲(chǔ)空間了。?方案3:使用extern方式引用外

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。