#define UPUT_SET_CHECK_POINT1(appType, tag, argNum1, v1, ...) \
if(NUMARGS(##__VA_ARGS__) == 0) \
UPUT_SET_CHECK_POINTx(1, appType, tag, argNum1, v1, UPUT_P_INVALID, 0, UPUT_P_INVALID, 0, UPUT_P_INVALID, 0, UPUT_P_INVALID, 0, __FILE__, __LINE__, UPUT_SEQUENTIAL); \
else \
UPUT_SET_CHECK_POINTx(1, appType, tag, argNum1, v1, UPUT_P_INVALID, 0, UPUT_P_INVALID, 0, UPUT_P_INVALID, 0, UPUT_P_INVALID, 0, __FILE__, __LINE__ , __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
所以当VA_ARGS为空时,我得到一个编译时错误"期望在'之前的primary-expression'"'token'.任何修复编译错误的方法.
void UPUT_SET_CHECK_POINTx(int numArg, CtblAppType appType, int tag, UputArgPos argNum1, int v1, UputArgPos argNum2, int v2, UputArgPos argNum3, int v3, UputArgPos argNum4, int v4, UputArgPos argNum5, int v5, char* fileName, unsigned int lineNumber, UputCheckPointAlgo checkPointAlgo=UPUT_SEQUENTIAL);
Run Code Online (Sandbox Code Playgroud)
如果您正在使用GCC,则可以, ## __VA_ARGS__在__VA_ARGS__空时使用消除逗号.
#define UPUT_SET_CHECK_POINT1(appType, tag, argNum1, v1, ...) \
UPUT_SET_CHECK_POINTx(1, appType, tag, argNum1, v1, \
UPUT_P_INVALID, 0, \
UPUT_P_INVALID, 0, \
UPUT_P_INVALID, 0, \
UPUT_P_INVALID, 0, \
__FILE__, __LINE__ , ## __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
另请参阅GCC的标准替代## __ VA_ARGS__技巧?.如果必须使用预处理器,则没有标准的解决方法.