我的多线程宏有什么问题?

fla*_*nik 1 c++ macros visual-studio-2008

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

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

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;
....
Run Code Online (Sandbox Code Playgroud)

但是我得到C2059和C2143错误指向分别在宏的最后一行围绕它的大括号和分号.

它出什么问题了??

Fab*_*sen 10

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

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


Ben*_*son 9

宏不像功能.每次出现est1都由文字文本替换new Est(estArg).宏的最后一行变为delete new Est(estArg).