LINUX.ORG.RU

Операторные скобки


0

2

Нашёл в исходниках gcc

#define def_mbuiltin(MASK, NAME, TYPE, CODE)				\
  do									\
    {									\
      if ((MASK) & insn_flags)						\
        builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, NULL, NULL_TREE);	\
    }									\
  while (0)

Зачем так делают? Ведь можно было бы просто

#define def_mbuiltin(MASK, NAME, TYPE, CODE)				\
	{									\
      if ((MASK) & insn_flags)						\
        builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, NULL, NULL_TREE);	\
    }

И так сплошь и рядом. Соглашение у них какое-то наверное.


{ } ограничивает область видимости. do-while-0 заставляет в конце вызова макроса поставить точку с запятой; это можно сделать и более другим способом, но тогда макрос может раскрыться неправильно.

staseg ★★★★★
()
Ответ на: комментарий от staseg

>заставляет в конце вызова макроса поставить точку с запятой;

Я в своих аналогичных макросах прекрасно обхожусь без точки с запятой. И сразу видно, что это макрос, а не функция. Сомнительное преимущество.

gogi
() автор топика
Ответ на: комментарий от DELIRIUM

>можно внутри блока сделать break; и будет некий аналог goto.

Для больших макросов - да, так и делают. А как в этом случае, где ничего подобного не предвидится, только код раздувают.

gogi
() автор топика
Ответ на: комментарий от gogi

В С и С++ точка с запятой должна ставиться в конце каждого выражения. Макросом вы делаете что-то, что внешне ведет себя как функция, но функцией являться может. Так зачем нарушать едиообразие языка и не ставить в конце «вызова» этой «функции» точку с запятой?

staseg ★★★★★
()
Ответ на: комментарий от summatus

>7-я страница.

Спасибо. Интересное чтиво.

gogi
() автор топика
Ответ на: комментарий от gogi

Если макрос ведёт себя как функция, то должен и выглядись как функция, т.е. с точкой с запятой в конце.

Yareg ★★★
()
Ответ на: комментарий от Yareg

>Если макрос ведёт себя как функция, то должен и выглядись как функция, т.е. с точкой с запятой в конце.

Но макрос не является функцией. И есть ситуации, когда код реализуемый макроподстановками сложно или невозможно реализовать в виде функции. И наоборот. То есть, макрос и функция однозначно разные объекты в программе. А для разных объектов традиционно и разный синтаксис.
Вобщем, вопрос на любителя. Кто как хочет, так и делает.

gogi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.