【问题标题】:How to define same macro function based on different parameters如何根据不同的参数定义相同的宏功能
【发布时间】:2012-05-15 21:19:44
【问题描述】:
#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);

【问题讨论】:

  • 你不能用模板来代替吗?
  • 似乎是一种相当复杂且难以理解的方式来做任何你想做的事情。会有一个更简单、类型安全且更易于阅读的解决方案。
  • UPUT_SET_CHECK_POINT1 是一个存在于 2000 个文件中的函数,我不想触摸这些文件,所以我想将其设为宏并用函数 UPUT_SET_CHECK_POINTx 替换
  • @PawanKumarSrivastava - 你仍然可以使用模板来做到这一点

标签: c++ macros


【解决方案1】:

如果您使用的是 GCC,you could use , ## __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__)

另见Standard alternative to GCC's ##__VA_ARGS__ trick?。如果您必须使用预处理器,则没有标准的解决方法。

【讨论】:

    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多