宏观问题,有多个语句

问题描述 投票:0回答:2
#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. 如果没有办法用宏以“可爱”的方式制作它,我还有其他选择吗?简单地说,我只想在其他代码“周围”(之前和之后)运行一些代码。

编辑:我会经常使用这个宏,总是使用不同的“中间”内容,所以我不能每次都编写内联函数。

c visual-studio macros
2个回答
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)

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");    
}
© www.soinside.com 2019 - 2024. All rights reserved.