C語言補丁原理,C語言可變長參數實現原理

(1)????? C語言可變參數

我們能夠從C語言的printf得出可變參數的作用。printf函數的原型例如以下:

int printf ( const char * format, ... );

通過使用可變個數參數,就是傳入的參數個數是可變的,如printf須要依據format實參傳入多個實參。

(2)????? C語言可變參數的使用

以下一個函數myprintf是自己實現的比較簡單的printf函數。不完整可是能夠說明可變參數的使用方法。

/*

* Author: guojun07

*/

#include

#include

#include

#include

void myprintf(char *format, ...) {

va_list ap;

int pos = 0;

int int_val = 0;

float f_val;

char buf[64];

memset(buf, 0, 64);

// 得到全部的參數放到下一個list中ap中

va_start(ap, format);

while (format[pos] != ' ') {

// 推斷'%'。表示要得到下一個參數

if (format[pos] == '%') {

pos ++;

switch(format[pos]) {

case 'd':

case 'u':

// 得到ap中的下一個參數

int_val = va_arg(ap, int);

sprintf(buf, "%d", int_val);

// 將數據寫到標準輸出

write(STDOUT_FILENO, buf, strlen(buf));

memset(buf, 0, 64);

pos ++;

break;

case 'f':

// 得到ap中的下一個參數

f_val = (float)va_arg(ap, double);

sprintf(buf, "%f", f_val);

// 將數據寫到標準輸出

write(STDOUT_FILENO, buf, strlen(buf));

memset(buf, 0, 64);

pos ++;

break;

default:

break;

}

} else {

write(STDOUT_FILENO, &(format[pos]), 1);

pos ++;

}

}

}

int main(void){

myprintf("this is a testing, i = %d, u = %u, f = %f

", -1, 5, 0.2);

return 0;

}

程序的數據結果例如以下:

guojun8@guojun8-desktop:~/test/valist$ ./main

this is a testing, i = -1, u = 5, f = 0.200000

(3)????? 實現

以下介紹C語言可變長度參數的實現。事實上現與一個數據結構(va_list)和三個宏(va_start, va_end, va_arg)相關,從源代碼中能夠看到這些實現以下的來自linux內核源代碼中的文件(include/acpi/platform/acenv.h)

#ifndef _VALIST

#define _VALIST

typedef char *va_list;

#endif??????? /* _VALIST */

/*

* Storage alignment properties

*/

#define? _AUPBND??????????????? (sizeof (acpi_native_int) - 1)

#define? _ADNBND??????????????? (sizeof (acpi_native_int) - 1)

/*

* Variable argument list macro definitions

*/

#define _bnd(X, bnd)??????????? (((sizeof (X)) + (bnd)) & (~(bnd)))

#define va_arg(ap, T)?????????? (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))

#define va_end(ap)????????????? (void) 0

#define va_start(ap, A)???????? (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))

a)???????? va_list

從實現中能夠看出va_list類型實際上就是一個指針。

b)??????? va_start

這個宏的作用是將T所指向的參數后面的內容放到ap中。當中_bnd (A,_AUPBND)是返回A的size并與系統的機器位數對齊。由于參數在棧中的地址一定是與系統的字長對齊的,當中acpi_native_int就表示機器字長。

c)???????? va_end

這個宏的作用就是返回0。

d)??????? va_arg

這個宏的作用是取得ap指向的當前的參數,并將ap指向參數列表中的下一個參數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

辦公技巧:各類特殊符號輸入快捷鍵,瞬間提高你的辦公效率

??作者主頁:IT技術分享社區 ??作者簡介:大家好,我是IT技術分享社區的博主,從事C#、Java開發九年,對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽: 數據庫領域優質創作者🏆&#x…

前端構建工具的用法—grunt、gulp、browserify、webpack

隨著前端項目的飛速發展,項目越來越大、文件越來越多,前端工程化的工具也越來越多。下面介紹目前最流行的四種構建工具——grunt、gulp、browserify、webpack 所有的構建工具都是基于NodeJs和Npm,所以使用下面任何工具都需要安裝Node 一、gru…

adb命令刷機vivox20_vivo手機變磚 刷機手機端口連上顯示adb

展開全部vivo的刷機解賬戶鎖方法如下 有了這個方法 以后不管手機出現啥毛病 只要是軟件系統引32313133353236313431303231363533e4b893e5b19e31333365643535起的故障 都能一招搞定提示:刷機有風險 刷機需謹慎 對于刷機造成的一切后果均與本處無關 而避免風險的最好…

SQLServer常用的聚合函數筆記

今天給大家分享一下SQLServer常用的聚合函數,希望對初學者有所幫助!1、COUNT合計函數:返回查詢記錄(行)數。格式:COUNT([ALL|DISTINCT] [表達式|*])參數說明:ALL:默認值,指對查詢所有…

android studio 工程demo例子,Android Studio 實現跑馬燈微項目實例

**閑來無事,自己做了很多小的Demo,現在分享一個小的跑馬燈項目實例,有機會把2048小游戲的Demo也發了。不過那個的算法稍微有點兒復雜,需要整理。首先在創建一個MarqueeTextViewDemo項目在res-layout-activity_main.xml中編寫出相應…

SQLServer常用的配置函數筆記

今天給大家分享一下SQLServer常用的配置函數知識,希望對初學者能有所幫助!1、DATEFIRST Datefirst返回值tinyint說明:datefirst指一周中的第一天,英語中第一天為星期日示例:SELECT DATEFIRST AS 1st Day, DATEPART(dw, GETDATE())…

localdatetime 默認時間_datetime-local設置初始值

//全局變量var format "";//構造符合datetime-local格式的當前日期function getFormat(){format "";var nTime new Date();format nTime.getFullYear()"-";format (nTime.getMonth()1)<10?"0"(nTime.getMonth()1):(nTime.get…

android音樂播放器完整教程,android實現簡單音樂播放器

本文實例為大家分享了android音樂播放器的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下話不多說先上效果前言寫這個音樂播放器實在是迫不得已。因為我們Andoird課程要求寫一個音樂播放器。所以就有了此項目。這個項目比較簡單&#xff0c;實現了最基本的音樂播放功…

編譯原理

編譯原理是計算機專業的一門重要專業課&#xff0c;旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 這門課程是一門真正與代碼做斗爭的課程&#xff0c;對于一個有至于追…

JDK1.8 JVM元數據區取代了永久代,元數據空間并不在虛擬機中,而是使用本地內存

JDK1.8 JVM運行時內存數據區域劃分。1.8同1.7比&#xff0c;最大的差別就是&#xff1a;元數據區取代了永久代。元空間的本質和永久代類似&#xff0c;都是對JVM規范中方法區的實現。不過元空間與永久代之間最大的區別在于&#xff1a;元數據空間并不在虛擬機中&#xff0c;而是…

SQLServer常用的字符串函數梳理

今天給大家分享一下SQLServer常用的字符串函數知識筆記&#xff0c;希望對大家能有所幫助&#xff01;1、ASCII(字符串表達式)作用&#xff1a;返回表達式最左側字符串的ASCII代碼值。示例&#xff1a;SELECT ASCII(ABC),ASCII(A) --返回結果都是65 計算的是第一個字符串的ASCI…

tchar linux,錯誤:Error:未定義標識符_TCHAR

svn sc create 命令行創建服務自啟動今天重裝了系統,Subversion服務也得重裝.照例輸入代碼: sc create svnserve binpath"d:\PortableApps\svn\svnserve.exe - ...Spring&lowbar;Springmvc&lowbar;mybatis一般配置web.xml配置 <?xml version"1.0" e…

Mac 系統引導過程概述 BootCamp 的秘密

http://bbs.feng.com/read-htm-tid-6890655.html轉載于:https://www.cnblogs.com/zengkefu/p/5857710.html

開封機器人餐廳_百合匯主題酒店——開封首家機器人服務員餐廳

【中原經濟網開封新聞訊】 (河南經濟報記者 張長劍 李海) 年底歲末&#xff0c;服務行業的用工荒逐漸凸顯&#xff0c;不過&#xff0c;開封百合匯主題酒店的老板卻不為此發愁&#xff0c;因為&#xff0c;這家店剛剛引進了兩臺高大上的機器人服務員。2月3日&#xff0c;記者在…

SQLServer常見的數學函數梳理

今天給大家分享一下SQLServer常見的數學函數相關的知識筆記。1.絕對值函數ABS(x)和返回圓周率的函數PI()ABS(x)返回x的絕對值,PI()返回圓周率的值用法&#xff1a;select ABS(5),ABS(-10.6),ABS(-99),PI();輸出結果&#xff1a;5 10.6 99 3.141592653589792.平方根函數SQRT(x)S…

android 屬性動畫變大,Android PropertyAnimation 屬性動畫(一)初探

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;前言相對于靜態的頁面&#xff0c;動畫往往能更直觀地表達所需的信息&#xff0c;在UI開發過程中起著相當大的作用。Android為我們提供了一系列實現動畫效果的方法…

android stadio svn 使用技巧

有時候有這樣的需求&#xff1a; 就是我一次要改很多的需求&#xff0c;然后代碼要分開提交&#xff0c;那么怎么辦&#xff1f; 提交的時候一個一個的點開看&#xff1f; 比如&#xff1a;這次改的還沒有提上去&#xff0c;又來了一個需求&#xff0c;怎么區分呢 新建一個ac…