第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C中使用varargs的示例

在C中使用varargs的示例

C
慕斯709654 2019-10-30 14:26:05
在這里,我找到了一個示例,說明如何在C中使用varargs。#include <stdarg.h>double average(int count, ...){    va_list ap;    int j;    double tot = 0;    va_start(ap, count); //Requires the last fixed parameter (to get the address)    for(j=0; j<count; j++)        tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.    va_end(ap);    return tot/count;}我只能在某種程度上理解此示例。我不清楚我們?yōu)槭裁词褂胿a_start(ap, count);。據(jù)我了解,通過這種方式,我們將迭代器設(shè)置為其第一個元素。但是,為什么默認(rèn)情況下不將其設(shè)置為開頭?我不清楚為什么我們需要給出count一個論據(jù)。C不能自動確定參數(shù)的數(shù)量嗎?我不清楚我們?yōu)槭裁词褂胿a_end(ap)。它會發(fā)生什么變化?是否將迭代器設(shè)置為列表的末尾?但是不是通過循環(huán)將其設(shè)置為列表的末尾嗎?而且,為什么我們需要它?我們不再使用ap;我們?yōu)槭裁匆乃?
查看完整描述

3 回答

?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊

但是,為什么默認(rèn)情況下不將其設(shè)置為開頭?


也許是由于歷史原因?qū)е碌?,?dāng)時編譯器還不夠聰明??赡苁且驗槟赡軗碛幸粋€varargs函數(shù)原型,而該原型實際上并不在乎varargs,而在該特定系統(tǒng)上設(shè)置varargs恰好很昂貴??赡苁且驗関a_copy您要執(zhí)行更復(fù)雜的操作,或者您想多次重新啟動參數(shù)并多次調(diào)用va_start。


簡短的版本是:因為語言標(biāo)準(zhǔn)是這樣說的。


第二,對我來說不清楚,為什么我們需要計數(shù)。C ++不能自動確定參數(shù)的數(shù)量嗎?


那不是全部count。它是函數(shù)的最后一個命名參數(shù)。va_start需要它來找出可變參數(shù)在哪里。這很可能是由于舊編譯器的歷史原因所致。我不明白為什么今天不能以不同的方式實現(xiàn)它。


問題的第二部分:不,編譯器不知道向該函數(shù)發(fā)送了多少個參數(shù)。它甚至可能不在同一編譯單元或同一程序中,并且編譯器也不知道該函數(shù)將如何被調(diào)用。想象一個具有varargs函數(shù)的庫,例如printf。當(dāng)您編譯libc時,編譯器不知道何時以及如何調(diào)用程序printf。在大多數(shù)ABI上(ABI是如何調(diào)用函數(shù),如何傳遞參數(shù)的約定,等等),無法找出函數(shù)調(diào)用獲得了多少個參數(shù)。將這些信息包含在函數(shù)調(diào)用中非常浪費,而且?guī)缀醪恍枰R虼?,您需要一種方法來告訴varargs函數(shù)有多少個參數(shù)。存取中va_arg 未定義的行為超出了實際傳遞的參數(shù)數(shù)量。


然后我不清楚我們?yōu)槭裁匆褂胿a_end(ap)。它會發(fā)生什么變化?


在大多數(shù)架構(gòu)va_end上,沒有任何相關(guān)的事情。但是有些架構(gòu)具有傳遞自變量語義的復(fù)雜參數(shù),va_start甚至可能潛在地va_end分配內(nèi)存,那么您就需要釋放該內(nèi)存。


這里的簡短版本也是:因為語言標(biāo)準(zhǔn)是這樣說的。


查看完整回答
反對 回復(fù) 2019-10-30
?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗 獲得超2個贊

va_start初始化變量參數(shù)列表。您總是將最后一個命名函數(shù)參數(shù)作為第二個參數(shù)傳遞。這是因為您需要提供有關(guān)堆棧中變量自變量開始的位置的信息,因為自變量被壓入堆棧,并且編譯器無法知道變量自變量列表的開始位置(沒有區(qū)別)。

至于va_end,它用于釋放在va_start調(diào)用期間分配給變量參數(shù)列表的資源。


查看完整回答
反對 回復(fù) 2019-10-30
  • 3 回答
  • 0 關(guān)注
  • 602 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號