Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > 'do {... some code ... } while(0)' в макросах.


Автор: boostcoder 11.2.2012, 15:18
привет.

часто в макросах встречаю такой код:
Код

#define MACRO(text) \
   do { \
      ... some code ... \
   while (0)


вместо "... some code ..." может быть что угодно. от условий и до циклов.

но для чего оборачивать в 'do{}while(0)' ?

спасибо.

Автор: rumit7 11.2.2012, 15:30
Цитата(boostcoder @ 11.2.2012,  15:18)
привет.

часто в макросах встречаю такой код:
Код

#define MACRO(text) \
   do { \
      ... some code ... \
   while (0)


вместо "... some code ..." может быть что угодно. от условий и до циклов.

но для чего оборачивать в 'do{}while(0)' ?

спасибо.

Чтобы после макроса можно было ставить ";" и http://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block.

Автор: boostcoder 11.2.2012, 15:35
Цитата(rumit7 @  11.2.2012,  15:30 Найти цитируемый пост)
Чтобы после макроса можно было ставить ";"

а что мешает?:
Код

#define MACRO(text) \
   { \
      ... some code ... \
   }


Добавлено через 3 минуты и 8 секунд
Цитата(rumit7 @  11.2.2012,  15:30 Найти цитируемый пост)
и не получить проблемы.

почитал. по моему, надуманная проблема..

Добавлено через 7 минут и 36 секунд
пытаются что-то объяснить про ';'. но символы ';' можно записывать подряд сколько угодно раз.

Автор: rumit7 11.2.2012, 15:52
Цитата(boostcoder @ 11.2.2012,  15:35)
Цитата(rumit7 @  11.2.2012,  15:30 Найти цитируемый пост)
Чтобы после макроса можно было ставить ";"

а что мешает?:
Код

#define MACRO(text) \
   { \
      ... some code ... \
   }


Добавлено @ 15:38
Цитата(rumit7 @  11.2.2012,  15:30 Найти цитируемый пост)
и не получить проблемы.

почитал. по моему, надуманная проблема..

Добавлено @ 15:42
пытаются что-то объяснить про ';'. но символы ';' можно записывать подряд сколько угодно раз.

Сравни http://liveworkspace.org/code/717482dc84d5f2706255357e25d08e0d:

Код

void func1(int a){}
void func2(int a){}
void func3(int a){}

#define CALL_FUNCS(x) \
do { \
  func1(x); \
  func2(x); \
  func3(x); \
} while (0)

int main()
{
   if(true)
      CALL_FUNCS(10);
   else
      CALL_FUNCS(20);
}


 и http://liveworkspace.org/code/e45d93671e14cfa792db6f3d4e23c98d:

Код

void func1(int a){}
void func2(int a){}
void func3(int a){}

#define CALL_FUNCS(x) \
{ \
  func1(x); \
  func2(x); \
  func3(x); \
}

int main()
{
   if(true)
      CALL_FUNCS(10);
   else
      CALL_FUNCS(20);
}


Второй код не компилится. Вот вывод компилятора:

Цитата

Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:16:4: error: 'else' without a previous 'if'


Автор: boostcoder 11.2.2012, 15:53
rumit7, а! доехал!

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)