?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和記怡情娛:C語言之可變參數問題

?

概述

C說話中有一種長度不確定的參數,形如:"…",它主要用在參數個數不確定的函數中,我們最輕易想到的例子是printf函數。

原型:

int printf( const char *format [, argument]... );

應用例:

printf("Enjoy yourself everyday!\n");

printf("The value is %d!\n", value);

這種可變參數可以說是C說話一個對照難理解的部分,這里會由幾個問題激發一些對它的闡發。

留意:在C++中有函數重載(overload)可以用來差別不合函數參數的調用,但它照樣不能表示隨意率性數量的函數參數。

問題:printf的實現

討教,若何自己實現printf函數,若何處置懲罰此中的可變參數問題? 謎底與闡發:

在標準C說話中定義了一個頭文件專門用來對于可變參數列表,和記怡情娛它包孕了一組宏,和一個va_list的typedef聲明。一個范例實現如下:

typedef char* va_list;

#define va_start(list) list = (char*)&va_alist

#define va_end(list)

#define va_arg(list, mode)\

((mode*) (list += sizeof(mode)))[-1]

自己實現printf:

#include

int printf(char* format, …)

{

va_list ap;

va_start(ap, format);

int n = vprintf(format, ap);

va_end(ap);

return n;

}

問題:運行時才確定的參數

有沒有法子寫一個函數,這個函數參數的詳細形式可以在運行時才確定?

謎底與闡發:

今朝沒有"正規"的辦理法子,不過獨門偏方倒是有一個,由于有一個函數已經給我們做出了這方面的榜樣,那便是main(),它的原型是:

int main(int argc,char *argv[]);

函數的參數是argc和argv。

深入想一下,"只能在運行時確定參數形式",也便是說你沒法子從聲明中看到所吸收的參數,也等于參和記怡情娛數根本就沒有固定的形式。常用的法子是你可以經由過程定義一個void *類型的參數,用它來指向實際的參數區,然后在函數中根據根據必要隨意率性解釋它們的含義。這便是main函數中argv的含義,而argc,則用來注解實際的參數個數,這為我們應用供給了進一步的方便,當然,這個參數不是必需的。

雖然參數沒有固定形式,但我們一定要在函數中解析參數的意義,是以,天經地義會有一個要求,便是調用者和被調者之間要對參數區內容的款式,大年夜小,有效性等所有方面殺青同等,否則南轅北轍各說各話就慘了。

問題:可變和記怡情娛長參數的通報

無意偶爾候,必要編寫一個函數,將它的可變長參數直接通報給別的的函數,討教,這個要求能否實現?

謎底與闡和記怡情娛發:

今朝,你尚無法子直接做到這一點,然則我們可以迂回提高,首先,我們定義被調用函數的參數為va_list類型,同時在調用函數中將可變長參數列表轉換為va_list,這樣就可以進行變長參數的通報了??慈缦滤荆?/p>

void subfunc (char *fmt, va_list argp)

{

...

arg = va_arg (fmt, argp); /* 從argp中一一掏出所要的參數 */

...

}

void mainfunc (char *fmt, ...)

{

va_list 和記怡情娛argp;

va_start (argp, fmt); /* 將可變長參數轉換為va_list */

subfunc (fmt, argp); /* 將va_list通報給子函數 */

va_end (argp);

...

}

問題:可變長參數中類型為函數指針

我想應用va_arg來提掏出可變長參數中類型為函數指針的參數,結果卻老是不精確,為什么?

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户