Почему используется этот макрос? - PullRequest
2 голосов
/ 18 января 2012

Я пытаюсь написать некоторый код микроконтроллера, используя примеры Texas Instruments, и он везде использует макросы (вероятно, для уменьшения размера кода), некоторые из которых окружены st (). Прочитав комментарии, я все еще не понимаю, почему это необходимо или когда мне следует это использовать:

/*
 *  This macro is for use by other macros to form a fully valid C statement.
 *  Without this, the if/else conditionals could show unexpected behavior.
 *
 *  For example, use...
 *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )
 *  instead of ...
 *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }
 *  or
 *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;
 *  The last macro would not behave as expected in the if/else construct.
 *  The second to last macro will cause a compiler error in certain uses
 *  of if/else construct
 *
 *  It is not necessary, or recommended, to use this macro where there is
 *  already a valid C statement.  For example, the following is redundant...
 *    #define CALL_FUNC()   st(  func();  )
 *  This should simply be...
 *    #define CALL_FUNC()   func()
 *
 * (The while condition below evaluates false without generating a
 *  constant-controlling-loop type of warning on most compilers.)
 */
#define st(x)      do { x } while (__LINE__ == -1)

Можете ли вы привести несколько примеров того, что не получилось бы, если бы там не было st? Есть ли вред в добавлении st, где это не нужно?

Что может означать st? Когда второй пример с { something } приводит к ошибкам компилятора? Потому что это также используется в некоторых примерах кода.

Ответы [ 2 ]

8 голосов
/ 18 января 2012

"do {...} while (0)" - это метод, используемый для избежания некоторых типов проблем.

__LINE__ == -1, вероятно, использовался, чтобы избежать некоторых предупреждений компилятора.__LINE__ == -1 всегда будет ложным.

Посмотрите на эту ссылку, и она объяснит причину "do ... while (0)"

http://cnicholson.net/2009/02/stupid-c-tricks-adventures-in-assert/

4 голосов
/ 18 января 2012

Пример:

#define a(x) if(x) { printf("%s\n", "OK"); }
int i = 1;
if(0)
    a(i);
else
    printf("%s\n", "KO");

Будет расширен до значения, эквивалентного:

if(0)
{
    if(x)
    {
        printf("%s\n", "OK");
    }
    else printf("%s\n", "KO");
}

Однако, если вы определите a(x) как:

 #define a(x) st(if(x) { printf("%s\n", "OK"); })

, оно будетработа, расширяющаяся до:

if(0)
{
    do
    {
        if(x)
        {
            printf("%s\n", "OK");
        }
    }
    while(0);
}
else printf("%s\n", "KO");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...