Проблема макроса с несколькими утверждениями - PullRequest
4 голосов
/ 15 декабря 2011
#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 ]

2 голосов
/ 15 декабря 2011

Вы можете разделить макрос на две части. Не красиво, но работает, когда макросы сопряжены. Ниже и 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 голосов
/ 15 декабря 2011

Вам, вероятно, повезет больше, если использовать указатели на функции .Я не скомпилировал это, но что-то вроде:

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