#define RUN_SOME_STUFF(...) { \
int x = 0; \
printf("[INFO] Do some stuff here ... %d\n", ++x); \
{__VA_ARGS__} \
printf("[INFO] end some stuff here\n"); \
}
我如何使用它:
...
RUN_SOME_STUFF(
{
// middle:
int y;
y = 100;
printf("Middle\n");
});
...
现在,我知道这被认为是一个(非常)丑陋的宏,但这是我寻求帮助的主要原因。
第一个问题是,如果出现任何类型的错误,编译器会将宏的最后一行显示为不正确的行。打印只是简化问题的示例(在两个代码片段中),因此可能有 20 行复杂的嵌套代码,在这种情况下这是非常烦人的。
第二个是__LINE__以同样的错误方式解决
&我确信还有更多...
1. 有没有办法纠正以上问题,使线路得到正确解决? (也许某种编译器选项?,我正在使用 VS2008/2010)
2. 如果没有办法用宏以“可爱”的方式制作它,我还有其他选择吗?简单地说,我只想在其他代码“周围”(之前和之后)运行一些代码。
编辑:我会经常使用这个宏,总是使用不同的“中间”内容,所以我不能每次都编写内联函数。
您可以将宏分成两部分。不太漂亮,但是当宏配对时它可以工作。下面都写了
RUN_BEGIN;
和 RUN_END;
,因此它们需要分号。
#define RUN_BEGIN \
do { \
int x = 0; \
printf("[INFO] Do some stuff here ... %d\n", ++x); \
{ \
(void)0
#define RUN_END \
} \
printf("[INFO] end some stuff here: %d\n",x ); \
} while (0)
使用函数指针你可能会有更好的运气。 我还没有编译这个,但是类似:
void runSomeStuff(void (*stuff)(void))
{
int x = 0;
printf("[INFO] Do some stuff here ... %d\n", ++x);
(*stuff)();
printf("[INFO] end some stuff here\n");
}