【问题标题】:How to does a variable argument Functioncall as macro define?如何将变量参数函数调用作为宏定义?
【发布时间】:2013-12-28 07:05:21
【问题描述】:

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

#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,或者确切的行为是什么?

【问题讨论】:

    标签: c macros c-preprocessor c99


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 但是__VA_ARGS__ 不是 c99 的东西,是吗?!还是我不明白你的例子?
    • @Zaibis:这很像 C99 的东西。
    • 刚刚打开了我的 ISO/IEC 9899 和 ctrl + f'ed for __VA_ARGS__,但我没有找到匹配项,以前从未见过......而且它自己的语法看起来更像 gnu99属性。
    • @Zaibis:再看一遍。 6.10.3.1/2.
    • 你说得对,我现在自己发现的,6.10.3 5 的分数不同,所以我的pdf中没有匹配...谢谢老兄。
    猜你喜欢
    • 2012-09-07
    • 2020-11-22
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多