Тема: do {...} while (0) у макросі

Я знайшов статтю про макроси, де описується чому використовують в макрос do {...} while (0) (я таку конструкцію побачив у GMP)
але не зрозумів всерівно.

В статті пише що такий

if (!feral) {
    bar(wolf);
    baz(wolf);
};
else
    bin(wolf);

синтаксис буде помилкою.

Я спробував відтворити

#include <iostream>

using namespace std;

void aa(int a)
{
    cout << "aa\n";
}

void bb(int b)
{
    cout << "bb\n";
}

#define f(wolf, feral) {  \
    if(!feral) \
    {\
        bb(wolf); \
        aa(wolf);\
    }\
    else \
    {\
        bb(wolf);\
    }\
}\

int main()
{
    f(6, true);
    getchar();
    return 0;
}

і в мене не виникло помилки, схоже я щось не так роблю, можете пояснити що ?

2 Востаннє редагувалося 0x9111A (10.01.2017 01:53:28)

Re: do {...} while (0) у макросі

Боюсь ви неправильно зрозуміли
Ви в макросі використовуєте if else, а "треба" (щоб відчути нащо do {...} while (0)) - навпаки

Подякували: koala, Betterthanyou2

3 Востаннє редагувалося koala (10.01.2017 09:11:29)

Re: do {...} while (0) у макросі

Ви неправильно зрозуміли. В макросі foo має бути тільки два вирази (bar(wolf) та baz(wolf)) і допоміжні структури, щоб вираз

if (!feral) 
    foo(wolf);
else
    bin(wolf);

нормально працював.
Як на мене, макрос, що схожий на функцію, та if без хвилястих дужок - то є зле, і робив би

if (!feral) {
    FOO(wolf)
}
else {
    bin(wolf);
}

Але, як бачите, не всі погоджуються.

Подякували: Betterthanyou, ntkrnlpa.exe2

4

Re: do {...} while (0) у макросі

Там проблема в тому що if написаний природньо, але невірно:

if (!feral)
    foo(wolf); <--
else
    bin(wolf);

Крапка з комою лишня, і після розгортання макросу foo

#define foo(x)  { bar(x); baz(x); }

перед else зявляється ;

if (!feral) {
    bar(wolf);
    baz(wolf);
}; <--
else
    bin(wolf);

У випадку використання do{...}while(0) замість {...}, крапка з комою не викликала б помилки компіляції

Подякували: Betterthanyou1