如何将变量参数Functioncall作为宏定义?

时间:2013-12-10 16:34:50

标签: c macros c-preprocessor c99

想象一下,我有一个调试源文件, 这是这样的:

#if _OWN_DEBUG_LEVEL != 0

    void DebugLogMsg (DebugStruct_t *DebugStruct, size_t sizeID, char const *szFormat, ...);

#else

    #define DebugLogMsg(_Expression1, _Expression2, _Expression3) ((void)0) 

#endif

在这种情况下,我并不真正关心函数的其他参数,但是这种情况呢?

#if _OWN_DEBUG_LEVEL > 0

    #undef DebugLogMsg1

    #define DebugLogMsg1(_Expression1, _Expression2, _Expression3) \ 
        DebugLogMsg(_Expression1, _Expression2, _Expression3)

#endif

在这种情况下,我不太确定......当我像这样调用宏时:

DebugLogMsg1(pointer, var, pointer, 1, 2, 3);

_Expression3视为pointer, 1, 2, 3或者确切行为是什么?

1 个答案:

答案 0 :(得分:2)

这是行不通的。您应该使用可变参数宏:

#define DebugLogMsg1(a, b, c, ...) DebugLogMsg(a, b, c, __VA_ARGS__)

或者更好(因为它不会导致尾随逗号的问题):

#define DebugLogMsg1(...) DebugLogMsg(__VA_ARGS__)