簡體   English   中英

使用可變參數的宏

[英]Macro using variable arguments

請讓我知道是否有辦法在宏函數中使用變量參數並使下面的宏代碼工作。

換句話說,有什么方法可以在 va_start 中使用局部變量。

typedef struct
{
    char *p1;
    char *p2;
    char *p3;
}Pointers;

#define NULLCHECK_VR(num, ...)                          \
        {                                               \
            va_list valist;                             \
            int     v_index;                            \
                                                        \
            va_start(valist, num);                      \
                                                        \
            for( v_index=0; v_index < num; v_index++)   \
            {                                           \
                if( NULL == va_arg(valist, void *))     \
                {                                       \
                    printf("NULL \n");                  \
                }                                       \
                else                                    \
                {                                       \
                    printf("NOT NULL \n");              \
                }                                       \
            }                                           \
                                                        \
            va_end(valist);                             \
        }

int main(void)
{
    Pointers ptr;

    memset(&ptr, 0, sizeof(Pointers));

    NULLCHECK_VR(3, ptr.p1, ptr.p2, ptr.p3)

    return (0);
}

您可能會使用常規功能:

void NULLCHECK_VR(int num, ...)
{
    va_list valist;
    int     v_index;

    va_start(valist, num);

    for( v_index=0; v_index < num; v_index++)
    {
        if( NULL == va_arg(valist, void *))
        {
            printf("NULL\n");
        }
        else
        {
            printf("NOT NULL\n");
        }
    }

    va_end(valist);
}

或在 C++ (17)

template <typename Ts>
void NULLCHECK_VR(const Ts*... ptrs)
{
    ((std::cout << (ptrs == nullptr ? "NULL\n" : "NOT NULL\n")), ...);
}

您不能使用va_list訪問局部變量。 va_startva_copyva_end宏僅用於處理可變參數函數參數。 宏不是函數。

對於 C 可變參數宏,宏替換文本中的__VA_ARGS__標識符將擴展為可變參數,因此NULLCHECK_VR宏的可能實現如下:

#define NULLCHECK_VR(num, ...)                          \
    do {                                                \
        void *_ptrs[] = { __VA_ARGS__ };                \
        int _num = (num);                               \
        int v_index;                                    \
                                                        \
        for (v_index = 0; v_index < _num; v_index++)    \
        {                                               \
            if (NULL == _ptrs[v_index])                 \
            {                                           \
                printf("NULL \n");                      \
            }                                           \
            else                                        \
            {                                           \
                printf("NOT NULL \n");                  \
            }                                           \
        }                                               \
    } while (0)

此處, __VA_ARGS__已用於初始化本地_ptrs數組。

(我添加了局部變量_num以避免多次擴展num參數,並且我使用了do while (0)成語將塊變成了語句。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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