成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

剖析C++ Sum函數獲取參數

開發 后端
C++ Sum函數是C++語言程序的主要組成部分,一個函數可以調用其他函數,在設計良好的程序中,每個函數都有特定的目的。

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

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

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

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

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

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

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

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

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

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

【編輯推薦】

  1. C與C++中標準輸入實現方式上的一點區別
  2. C++編譯器如何對Const常量進行分配存儲空間
  3. C++類庫設計的基本構思與方法
  4. 玩轉C++語言的幾種方法
  5. 如何更好的進行C++代碼編制
責任編輯:chenqingxiang 來源: 計世網
相關推薦

2022-07-18 15:32:37

C++虛函數表

2010-02-06 16:39:45

C++ assert(

2010-01-14 17:42:47

CC++

2010-01-28 16:31:54

C++類型

2010-01-20 17:32:16

C++函數

2010-01-25 10:10:42

C++函數參數

2010-02-06 16:05:51

C++ Vector

2023-11-17 14:10:08

C++函數

2010-01-25 09:57:39

C++函數參數

2010-01-15 10:32:21

C++語言

2010-02-04 10:19:39

C++多線程

2010-01-26 14:46:42

C++語言

2010-02-03 10:05:48

C++ enum枚舉

2010-01-26 17:16:33

C++應用程序

2010-01-28 14:54:01

C++資源管理

2010-02-05 17:09:19

C++創建Web服務

2010-01-13 10:16:42

C++軟件

2010-01-27 15:50:23

C++復雜性

2022-09-12 06:35:00

C++協程協程狀態

2010-02-04 13:45:36

C++類模板
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色妹子综合网 | 日韩欧美在线一区 | 欧美在线观看免费观看视频 | 久久99这里只有精品 | 国产精品久久久久久一区二区三区 | www.免费看片.com | 欧美日韩在线一区 | 三级特黄特色视频 | avav在线看 | 久久久久免费精品国产 | 精品自拍视频在线观看 | 中文字幕不卡在线观看 | 在线91| 欧美精品乱码久久久久久按摩 | 五月激情久久 | 日日干夜夜操 | 日韩视频区| 精品婷婷 | 成年人精品视频 | 91精品国产综合久久久久久丝袜 | 国产精品久久国产精品 | 国产午夜精品一区二区三区嫩草 | 日日射影院 | 精品一区二区三区四区在线 | 一级在线免费观看 | 欧美 日韩 视频 | 美女国产一区 | 九九伦理电影 | 黄色一级大片在线免费看产 | 久久久久久久久中文字幕 | 日韩精品一区二区三区中文在线 | 亚洲色图50p | 日韩在线免费视频 | 国产激情一区二区三区 | 欧美黄色小视频 | 欧美女优在线观看 | 免费亚洲视频 | 国产美女黄色 | 国产一区二区 | 欧美综合一区二区三区 | 一级全黄少妇性色生活免费看 |