#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. 如果无法以“可爱”的方式使用宏,我还有其他选择吗?简单地说,我只想在其他代码“周围”(之前和之后)运行一些代码。
编辑:我会经常使用这个宏,总是使用不同的“中间”内容,所以我不能每次都写一个内联函数。
答案 0 :(得分: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)
答案 1 :(得分:0)
使用function pointers你可能会有更好的运气。我没有编译这个,但是像:
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");
}