3
#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__) 

したがって、VA_ARGSが空の場合、コンパイル時エラー「')'トークンの前にプライマリ式が必要です」というエラーが発生します。コンパイルエラーを修正する方法。

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);
4

1 に答える 1

9

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__)

GCCの##__VA_ARGS__トリックの標準的な代替手段も参照してください。。プリプロセッサを使用する必要がある場合、これに対する標準的な回避策はありません。

于 2012-05-07T12:52:23.630 に答える