我的多行宏有什么问题?

时间:2010-11-07 06:32:10

标签: c++ visual-studio-2008 macros

我有一个函数mainFunc,它需要多次调用另一个函数processprocess有很多参数但是mainfunc在不同的调用中只改变其中的两个/而不是另一个它传递在调用process之前定义和分配的局部变量。所以我编写了一个简单的宏,用于在调用process

时替换局部变量
#define DO_PROCESS(pred1, est1)     \
do                      \
{                       \
    process(pred1, est1, arg1, arg2, arg3); \
    ++id;                   \ 
    delete est1;                \
} while(0)

arg1arg2arg3mainFunc中的局部变量,所以我希望我的宏只会使用它们。在mainFunc中:

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;
....

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

它出了什么问题?

6 个答案:

答案 0 :(得分:10)

最可能的原因是在宏定义中的一个反斜杠后面有额外的空格。确保\确实是一行中的最后一个字符。

哦,你的代码会泄漏内存,因为est1在你的宏定义中被评估了两次 - 它扩展到process(pred1, new Est(...), ...)然后扩展到delete new Est(...),这不是你的意思。在Est *e = est1;调用之前添加process之类的内容,并使用est1替换宏中e的剩余事件,以避免此问题。

答案 1 :(得分:9)

宏不像函数。每次出现的est1都会被文字new Est(estArg)取代。宏的最后一行变为delete new Est(estArg)

答案 2 :(得分:3)

我不确定这是不是,但是这个宏如何扩展:

pred = new Pred(predArg);
do {
    process(pred, new Est(estArg),arg1,arg2,arg3);
    ++id;
    delete new Est(estArg);
} while(0);
delete pred;

答案 3 :(得分:3)

首先,为什么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)

答案 4 :(得分:1)

您正在使用delete语句中的宏var est1 ..这可能是罪魁祸首!

答案 5 :(得分:1)

宏将(部分)扩展为:

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

这不会做你想做的事情 - 一个宏不是一个函数。它泄漏了记忆。