Зачем использовать явно бессмысленные операторы do-while и if-else в макросах? - PullRequest
721 голосов
/ 30 сентября 2008

Во многих макросах C / C ++ я вижу код макроса, заключенный в нечто вроде бессмысленного цикла do while. Вот примеры.

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else

Я не вижу, что делает do while. Почему бы просто не написать это без него?

#define FOO(X) f(X); g(X)

Ответы [ 11 ]

0 голосов
/ 12 декабря 2018

Причина, по которой do {} while (0) используется вместо if (1) {}, заключается в том, что никто не может изменить код перед вызовом макроса do {} while (0) в качестве блока другого типа. Например, если вы вызвали макрос, окруженный if (1) {}, например:

else
  MACRO(x);

Это на самом деле else if. Тонкая разница

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...