<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > C語(yǔ)言中不定參數的應用

C語(yǔ)言中不定參數的應用

作者: 時(shí)間:2012-06-08 來(lái)源:網(wǎng)絡(luò ) 收藏

使用列表,有兩個(gè)問(wèn)題特別需要注意。

問(wèn)題1的理解相對簡(jiǎn)單:我們在重載一個(gè)函數的時(shí)候,不能依賴(lài)列表部分對函數進(jìn)行區分。

假定我們定義兩個(gè)重載函數如下:

int func(int a, int b, ……)

int func(int a, int b, float c);

則上述函數會(huì )導致編譯器不知道怎么去解釋func(1,2, 3.3),因為當第三個(gè)為浮點(diǎn)數時(shí),兩個(gè)實(shí)現都可以滿(mǎn)足匹配要求。一般情況,個(gè)人建議對于參數函數不要去做重載。

另外一個(gè)問(wèn)題是關(guān)于類(lèi)型問(wèn)題。絕大多數情況下,C和C++的變量都是強類(lèi)型的,而不定參數列表屬于一個(gè)特例。

當我們調用va_arg的時(shí)候,我們指明下一個(gè)參數的類(lèi)型,而在執行的時(shí)候,va_arg正是根據這個(gè)信息在堆棧上來(lái)找到對應的參數的。如果我們需要的類(lèi)型和真實(shí)傳遞進(jìn)來(lái)的參數完全一致時(shí)自然沒(méi)有問(wèn)題,但是假如類(lèi)型不一樣,則會(huì )有大麻煩。

假如上面的的sumi函數,我們用下面方法調用:

int sum = sumi(1, 2.2, 3, 0)

注意第二個(gè)參數我們傳入了一個(gè)double類(lèi)型的2.2,我們希望sumi在做加法時(shí)可以做隱式類(lèi)型轉換,轉換為int進(jìn)行計算。但是實(shí)際情況時(shí),當我們分析到這個(gè)參數時(shí),調用的是:

c=va_arg(ap,int)

據前文va_arg的定義,這個(gè)宏被翻譯成:

#define va_arg(ap,t) ( *(int *)((ap += _INTSIZEOF(int)) - _INTSIZEOF(int)) )

如果后面的+=計算出正確的地址,最后就變成

*(int*)addr

如果希望能得到正確的整數值,必須要求addr所在的地址是一個(gè)真實(shí)的int類(lèi)型。但是當我們傳入double時(shí),實(shí)際上其內存布局和int完全不同,因此我們得不到需要的整數。感興趣的朋友可以用下面簡(jiǎn)單的代碼做測試:

double a;

a=1.1;

int b = *(int*) a;

因此,當我們調用有不定參數列表的函數時(shí),不要期望系統做隱式類(lèi)型轉換,系統不會(huì )做這種檢查或者轉換,你給的參數類(lèi)型必須嚴格和你希望的值一樣。

本文引用地址:http://dyxdggzs.com/article/148927.htm
上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: 應用 參數 不定 語(yǔ)言

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>