代码之家  ›  专栏  ›  技术社区  ›  flashnik

我的多行宏怎么了?

  •  1
  • flashnik  · 技术社区  · 14 年前

    我有个功能 mainFunc 需要多次调用另一个函数 process . 一个 过程 mainfunc 在不同的调用中,只更改其中的两个/而不是另一个,它将本地变量传递给 . 所以我写了一个简单的宏,它在调用 :

    #define DO_PROCESS(pred1, est1)     \
    do                      \
    {                       \
        process(pred1, est1, arg1, arg2, arg3); \
        ++id;                   \ 
        delete est1;                \
    } while(0)
    

    arg1 , arg2 , arg3 主功能

    int arg1, arg2, arg3;
    arg1 = AssignFirst();
    ...
    Pred* pred;
    Est* est;
    int estArg;
    int predArg;
    
    pred = new Pred(predArg);
    DO_PROCESS(pred, new Est(estArg));
    delete pred;
    
    pred = new Pred(predArg2);
    DO_PROCESS(pred, new Est(estArg2));
    delete pred;
    
    pred = new Pred(predArg3);
    DO_PROCESS(pred, new Est(estArg3));
    delete pred;
    ....
    

    然而,在宏的最后一行中,我得到了c259和C2143错误,分别指向了右大括号和它周围的分号。

    怎么了??

    6 回复  |  直到 14 年前
        1
  •  10
  •   Fabian Giesen    14 年前

    最可能的原因是宏定义中的反斜杠之一后面有多余的空格。确保 \ 真的是一行的最后一个字符。

    est1 在宏定义中计算两次-它扩展为 process(pred1, new Est(...), ...) 后来 delete new Est(...) Est *e = est1; process 调用并替换剩余的 est1号 在宏中使用 e

        2
  •  9
  •   Ben Jackson    14 年前

    宏不像函数。每次发生 est1 被文本替换 new Est(estArg) delete new Est(estArg) .

        3
  •  3
  •   Yuliy    14 年前

    pred = new Pred(predArg);
    do {
        process(pred, new Est(estArg),arg1,arg2,arg3);
        ++id;
        delete new Est(estArg);
    } while(0);
    delete pred;
    
        4
  •  3
  •   ta.speot.is    14 年前

    首先,为什么 do ... while (0) ? 为什么不 { code } DO_PROCESS(pred, new Est(estArg2)) 替代品:

    do
    {
        process(pred, new Est(estArg2), arg1, arg2, arg3);
        ++id;
        delete new Est(estArg2);
    } while(0)
    
        5
  •  1
  •   James    14 年前

    您还在delete语句中使用宏变量est1。。那很可能是罪魁祸首!

        6
  •  1
  •   Jonathan Leffler Toon Krijthe    14 年前

    宏展开(部分)为:

    process(pred, new Est(estArg), arg1, arg2, arg3);
    id++;
    delete new Est(estArg);
    

    它不会做你想它做的事情-宏是 功能。它会泄露记忆。