以實現函式printf的乙個最簡單版本為例,介紹如何以可移植的方式編寫可處理變長參數列的函式。因為我們的重點在於引數的處理,所以,函式minprintf只處理格式字串和引數,格式轉換則通過呼叫函式printf實現。
函式printf的正確宣告形式為:
int其中,省略號表示參數列中引數的數量和型別是可變的。省略號只能出現在參數列的尾部。因為minprintf函式不需要想printf函式一樣返回實際輸出的字元數,因此,我們將它宣告為下列形式:printf(
char
*fmt, ...)
void編寫函式minprintf的關鍵在於如何處理乙個甚至連名字都沒有的參數列。標準標頭檔案中包含一組巨集定義,它們對如何遍歷參數列進行了定義。改標頭檔案的實現因不同的機器而不同,但提供的介面是一致的。minprintf(
char
*fmt, ...)
va_list型別用於宣告乙個變數,該變數將依次引用各引數。在函式minprintf中,我們將該變數稱為ap,意思是「引數指標」。巨集va_start將ap初始化為指向第乙個無名引數的指標。在使用ap之前,該巨集必須被呼叫一次。參數列必須至少包括乙個有名引數,va_start將最後乙個有名引數作為起點。
每次呼叫va_arg,該函式都將返回乙個引數,並將ap指向下乙個引數。va_arg使用乙個型別名來決定返回的物件型別、指標移動的步長。
最後,必須在函式返回之前呼叫va_end,以完成一些必要的清理工作。
#include以實現函式printf的乙個最簡單版本為例,介紹如何以可移植的方式編寫可處理變長參數列的函式。因為我們的重點在於引數的處理,所以,函式minprintf只處理格式字串和引數,格式轉換則通過呼叫函式printf實現。<
stdio.h
>
#include
<
stdarg.h
>
void
minprintf(
char
*fmt, ...)
switch
(*++p)}
va_end(ap);
}int
main()
函式printf的正確宣告形式為:
int其中,省略號表示參數列中引數的數量和型別是可變的。省略號只能出現在參數列的尾部。因為minprintf函式不需要想printf函式一樣返回實際輸出的字元數,因此,我們將它宣告為下列形式:printf(
char
*fmt, ...)
void編寫函式minprintf的關鍵在於如何處理乙個甚至連名字都沒有的參數列。標準標頭檔案中包含一組巨集定義,它們對如何遍歷參數列進行了定義。改標頭檔案的實現因不同的機器而不同,但提供的介面是一致的。minprintf(
char
*fmt, ...)
va_list型別用於宣告乙個變數,該變數將依次引用各引數。在函式minprintf中,我們將該變數稱為ap,意思是「引數指標」。巨集va_start將ap初始化為指向第乙個無名引數的指標。在使用ap之前,該巨集必須被呼叫一次。參數列必須至少包括乙個有名引數,va_start將最後乙個有名引數作為起點。
每次呼叫va_arg,該函式都將返回乙個引數,並將ap指向下乙個引數。va_arg使用乙個型別名來決定返回的物件型別、指標移動的步長。
最後,必須在函式返回之前呼叫va_end,以完成一些必要的清理工作。
#include<
stdio.h
>
#include
<
stdarg.h
>
void
minprintf(
char
*fmt, ...)
switch
(*++p)}
va_end(ap);
}int
main()
系統參數列的設計
create table t systemprofile fsystemprofileid bigint not null,系統參數列id fcategory varchar 30 not null,類別 fkey varchar 30 not null,類別下的表示符號 fvalue nvarch...
多個相同引數表單提交
現在需要使用非同步提交表單資料 querystring方式 但資料個數比較多,乙個個拼接比較麻煩,這時可以使用jquery的方法 form serialize 對表單進行序列化。但是如果這時,資料中有幾個是相同的name屬性,這是在後台使用request 就只能接收第乙個的值。於是,問題就來了,下面...
可變參數列函式的原理及實現
ansi c中庫函式printf的正確形式如下 int printf char fmt,其中,省略號表示參數列的數量和型別是可變的。省略號只能出現在參數列的尾部。如何實現這樣乙個具有可變參數列的函式?在 the c programme language 中實現了這樣乙個示例函式 void minpr...