想象一下,我有一个调试源文件, 这是这样的:
#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
或者确切行为是什么?
答案 0 :(得分:2)
这是行不通的。您应该使用可变参数宏:
#define DebugLogMsg1(a, b, c, ...) DebugLogMsg(a, b, c, __VA_ARGS__)
或者更好(因为它不会导致尾随逗号的问题):
#define DebugLogMsg1(...) DebugLogMsg(__VA_ARGS__)