[英]C variadic function: How to specify which type to give to va_arg
在類似printf的函數中,我們使用stdarg.h
處理可變參數。
void print(int args,...){
va_list ap;
va_start(ap, args);
int i = 0;
for(i=0; i<args; i++){
printf("%d\n",va_arg(ap, int));
}
va_end(ap);
}
我們想解析格式列表(給可變參數函數的第一個參數),以跟蹤格式列表中指定的參數類型,然后用適當的類型調用va_arg。
我進行第一個循環以分析格式列表,將說明字母存儲到數組中。 所以我知道我們期望哪種類型,以及有多少種。
例如: ft_like_printf("Watch your %d %s\\n", 6, "Spider pig");
specifiers_list = "ds"
所以d <=> int和s <=> char *(與printf相同的說明符)
但是如何動態編碼呢? 用differents類型調用va_arg的語法是什么?
我已閱讀本和THAT我認為是什么我要找的,不是嗎? 如果是,該怎么辦? 包含枚舉+聯合的結構或包含聯合+函數指針的結構的實際情況是什么?
為了處理不同的數據類型,我從這里開始:
typedef struct s_flist
{
char c;
(*f)();
} t_flist;
t_flist flist[] =
{
{ 's', &putstr },
{ 'i', &put_number },
{ 'd', &put_number }
};
類型不是C語言中的一等公民。
但是,您不必擔心很多類型:您可以安全地將類型從unsigned
為signed
,反之亦然, char*
和void*
也是如此,因此對於基本的printf,您必須處理:
union
來救援!
typedef union
{
char as_char;
short as_short;
int as_int;
long as_long;
float as_float;
double as_double;
void* as_ptr;
} t_value;
typedef enum {
CHAR_T,
INT_T,
/* It goes on */
...
} t_type;
t_value get_value(va_list ap, t_type type) {
/* You can't avoid this step, there is no way to iterate over types */
switch (type) {
case T_CHAR:
return va_arg(ap, char);
case T_INT:
/* ... */
}
}
然后,您只需要創建一個查找表, t_type
為每個有效格式說明符存儲一個函數指針和一個t_type
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.