簡體   English   中英

C可變參數函數:如何指定要賦予va_arg的類型

[英]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語言中的一等公民。

但是,您不必擔心很多類型:您可以安全地將類型從unsignedsigned ,反之亦然, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM