LINUX.ORG.RU

История изменений

Исправление A-234, (текущая версия) :

Тут как раз все просто, это делается на случай употребления данной конструкции в else. Сопоставьте необходимость в употреблении ";" в следующем примере, это должно навести вас на мысль :)

#define X(v)	do { v += v + 1; } while (0)
#define Y(v)	{ v += v + 1; }

int
main(int argc, char** argv)
{
    int x;

    if (argc == 1)
	x = 3;
    else
	x = 1;

    if (argc == 2)
	X(argc);
    else
	Y(argc);

    if (argc == 3)
	Y(argc)
    else
	X(argc);

    return 0;
}

Исходная версия A-234, :

Тут как раз все просто, это делается на случай употребления данной конструкции в else. Сопоставьте необходимость в употреблении ";" в следующем примере, это должно навести вас на мысль :)

#define X(v)	do { v += v + 1; } while (0)
#define Y(v)	{ v += v + 1; }

int
main(int argc, char** argv)
{
    int x;

    if (argc == 1)
	x = 3;
    else
	x = 1;

    if (argc == 2)
	X(argc);
    else
	Y(argc);

    if (argc == 3)
	Y(argc)
    else
	X(argc);

    return 0;
}
Но дикость в том определении совсем в другом ;)