宏问题,有多个语句

时间:2011-12-14 21:50:29

标签: c visual-studio compiler-construction macros

#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. 如果无法以“可爱”的方式使用宏,我还有其他选择吗?简单地说,我只想在其他代码“周围”(之前和之后)运行一些代码。

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

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");    
}