日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
剖析C++Sum函數(shù)獲取參數(shù)

在C++中的函數(shù)當中,C++ Sum函數(shù)可以使用SUM來進行任何求和,但無法使用任何名稱訪問其他的幾個不定參數(shù),但此時由于棧上其他的幾個參數(shù)實際恰好依序排列在參數(shù)SUM的高地址方向。

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,創(chuàng)新互聯(lián)公司面向各種領域:銅雕雕塑網(wǎng)站設計、營銷型網(wǎng)站建設解決方案、網(wǎng)站設計等建站排名服務。


因此可以很簡單地通過num的地址計算出其他參數(shù)的地址。sum函數(shù)的實現(xiàn)如下:

 
 
 
  1. int sum(unsigned num, ...)
  2.   {
  3.   int* p = &num + 1;
  4.   int ret = 0;
  5.   while (num--)
  6.   ret += *p++;
  7.   return ret;
  8.   }

在這里我們可以觀察到兩個事實:

(1)C++ Sum函數(shù)獲取參數(shù)的量僅取決于num參數(shù)的值,因此,如果num參數(shù)的值不等于實際傳遞的不定參數(shù)的數(shù)量,那么C++ Sum函數(shù)可能取到錯誤的或不足的參數(shù)。

(2)cdecl調(diào)用慣例保證了參數(shù)的正確清除。我們知道有些調(diào)用慣例(如stdcall)是由被調(diào)用方負責清除堆棧的參數(shù),然而,被調(diào)用方在這里其實根本不知道有多少參數(shù)被傳遞進來,所以沒有辦法清除堆棧。而cdecl恰好是調(diào)用方負責清除堆棧,因此沒有這個問題。

printf的不定參數(shù)比sum要復雜得多,因為printf的參數(shù)不僅數(shù)量不定,而且類型也不定。所以printf需要在格式字符串中注明參數(shù)的類型,例如用%d表明是一個整數(shù)。printf里的格式字符串如果將類型描述錯誤,因為不同參數(shù)的大小不同,不僅可能導致這個參數(shù)的輸出錯誤,還有可能導致其后的一系列參數(shù)錯誤。

 
 
 
  1.  #define va_list char*
  2.   #define va_start(ap,arg) (ap=(va_list)&arg+sizeof(arg))
  3.   #define va_arg(ap,t) (*(t*)((ap+=sizeof(t))-sizeof(t)))
  4.   #define va_end(ap) (ap=(va_list)0)
  5. printf的狂亂輸出
  6.   #include
  7.   int main()
  8.   {
  9.   printf("%lf\t%d\t%c\n", 1, 666, 'a');
  10.   }

在這個程序里,printf的第一個輸出參數(shù)是一個int(4字節(jié)),而我們告訴printf它是一個double(8字節(jié)以上),因此C++ Sum函數(shù)的輸出會錯誤,由于printf在讀取double的時候?qū)嶋H造成了越界,因此后面幾個參數(shù)的輸出也會失敗。

在很多時候我們希望在定義宏的時候也能夠像print一樣可以使用變長參數(shù),即宏的參數(shù)可以是任意個,這個功能可以由編譯器的變長參數(shù)宏實現(xiàn)。在GCC編譯器下,變長參數(shù)宏可以使用“##”宏字符串連接操作實現(xiàn)。


文章名稱:剖析C++Sum函數(shù)獲取參數(shù)
網(wǎng)頁鏈接:http://www.5511xx.com/article/coddosi.html