我有一个函数mainFunc
,它需要多次调用另一个函数process
。 process
有很多参数但是mainfunc
在不同的调用中只改变其中的两个/而不是另一个它传递在调用process
之前定义和分配的局部变量。所以我编写了一个简单的宏,用于在调用process
:
#define DO_PROCESS(pred1, est1) \
do \
{ \
process(pred1, est1, arg1, arg2, arg3); \
++id; \
delete est1; \
} while(0)
arg1
,arg2
,arg3
是mainFunc
中的局部变量,所以我希望我的宏只会使用它们。在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错误分别指向在最后一行宏中围绕它的大括号和分号。
它出了什么问题?
答案 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);
这不会做你想做的事情 - 一个宏不是一个函数。它泄漏了记忆。