Аналог do{...} while(0)
От: Осенний дождь Россия  
Дата: 09.11.07 11:17
Оценка:
Добрый день

При написании многих своих программ я использую макросы следующего вида


#define MACRO_NAME(x) \
   do{
  ...do something...
  }while(0)


Использование конструкции do{...}while(0) дает следующие преимущества:
1) Внутри цикла можно определять переменные необходимые для работы макроса. Видимость этих переменных будет ограничена телом цикла, что позволяет вызывать один и тот же
макрос несколько раз внутри одной функции
2) Вызов макроса заканчивается на символ ;, благодаря этому вызов макроса и вызов функции внешне ничем не отличаются

При компиляции проекта с уровнем предупреждений 4 (/W4) компилятор выдает предупреждения о использовании константы в качестве условия цикла (warning C4127: conditional expression is constant).
Подскажите, как по другому можно организовывать работу макросов и сохранить преимущества моего варианта ( главное — преимущество №1 ), отключать предупреждение 4127 не хочется.
Re: Аналог do{...} while(0)
От: Roman Odaisky Украина  
Дата: 09.11.07 11:25
Оценка:
Здравствуйте, Осенний дождь, Вы писали:

ОД>Подскажите, как по другому можно организовывать работу макросов и сохранить преимущества моего варианта ( главное — преимущество №1 ), отключать предупреждение 4127 не хочется.


do { . . . } while(suppressWarnings<bool, false>())


как реализовать — думаю, сам догадаешься.
До последнего не верил в пирамиду Лебедева.
Re: Аналог do{...} while(0)
От: Demon Россия  
Дата: 09.11.07 12:06
Оценка: +2
Здравствуйте, Осенний дождь, Вы писали:

Так подойдет?
#define MACRO_NAME(x) \
  {
  ...do something...
  }


ОД>1) Внутри цикла можно определять переменные необходимые для работы макроса. Видимость этих переменных будет ограничена телом цикла, что позволяет вызывать один и тот же макрос несколько раз внутри одной функции

Должно работать.
ОД>2) Вызов макроса заканчивается на символ ;, благодаря этому вызов макроса и вызов функции внешне ничем не отличаются
Тоже проблем нет. Правда в этом случае ты можешь не ставить ;.

Но по-хорошему — используй inline функции.
Re[2]: Аналог do{...} while(0)
От: quodum  
Дата: 09.11.07 13:41
Оценка: 24 (1)
Здравствуйте, Demon, Вы писали:

D>Так подойдет?

#define MACRO_NAME(x) \
  {
  ...do something...
  }


[]


Не вполне эквивалентная замена:

if ( cond )
    MACRO_NAME(x);   // тут сломается из-за точки-с-запятой
else
    do_something_else();
Re[2]: Аналог do{...} while(0)
От: matcode Беларусь  
Дата: 09.11.07 15:41
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Осенний дождь, Вы писали:


ОД>>Подскажите, как по другому можно организовывать работу макросов и сохранить преимущества моего варианта ( главное — преимущество №1 ), отключать предупреждение 4127 не хочется.


RO>
do { . . . } while(suppressWarnings<bool, false>())


RO>как реализовать — думаю, сам догадаешься.


template< class T>
inline T suppressWarnings( T v)
{
    return v;    
}

do { . . . } while(suppressWarnings(false))[/c]


А так?
Оптимизатор IMHO уберет все лишнее.
Re[3]: Аналог do{...} while(0)
От: Roman Odaisky Украина  
Дата: 09.11.07 17:32
Оценка:
Здравствуйте, matcode, Вы писали:

M>А так?

Можно и так.

M>Оптимизатор IMHO уберет все лишнее.

Естественно, в этом-то весь смысл.
До последнего не верил в пирамиду Лебедева.
Re: Аналог do{...} while(0)
От: alexeiz  
Дата: 09.11.07 21:29
Оценка: 116 (12)
Здравствуйте, Осенний дождь, Вы писали:

ОД>При компиляции проекта с уровнем предупреждений 4 (/W4) компилятор выдает предупреждения о использовании константы в качестве условия цикла (warning C4127: conditional expression is constant).


do {} while (0, 0);
Re[2]: Аналог do{...} while(0)
От: Roman Odaisky Украина  
Дата: 10.11.07 11:23
Оценка:
Здравствуйте, alexeiz, Вы писали:

ОД>>При компиляции проекта с уровнем предупреждений 4 (/W4) компилятор выдает предупреждения о использовании константы в качестве условия цикла (warning C4127: conditional expression is constant).


A>
A>do {} while (0, 0);
A>

И точно!

Можно еще и обобщить:
#define SUPPRESS_WARNINGS(expr) ( (void)0, (expr) )
До последнего не верил в пирамиду Лебедева.
Re[2]: Аналог do{...} while(0)
От: Кодт Россия  
Дата: 12.11.07 13:34
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>do {} while (0, 0);

А-фи-геть. Значит, 0+0 — это константа времени компиляции, а 0,0 — уже нет?! Колдунское колдунство.
... << RSDN@Home 1.2.0 alpha rev. 655>>
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[3]: Аналог do{...} while(0)
От: Bell Россия  
Дата: 12.11.07 15:40
Оценка: 39 (3)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, alexeiz, Вы писали:


К>
A>>do {} while (0, 0);
К>

К>А-фи-геть. Значит, 0+0 — это константа времени компиляции, а 0,0 — уже нет?! Колдунское колдунство.

Пробуем заколдовать Комо:
int arr[0, 2];



"ComeauTest.c", line 1: error: the size of an array must be greater than zero
int arr[0, 2];
^


Попытка номер 2:
int arr[(0, 2)];


"ComeauTest.c", line 1: error: this operator is not allowed in a constant expression
int arr[(0, 2)];
^


Ага, смотрим 5.19/1

...
In particular, except in sizeof expressions, functions, class objects, pointers, or
references shall not be used, and assignment, increment, decrement, function-call, or comma operators shall
not be used.


И никакого колдовства
Любите книгу — источник знаний (с) М.Горький
Re[4]: Аналог do{...} while(0)
От: Кодт Россия  
Дата: 12.11.07 17:24
Оценка: +1 :)
Здравствуйте, Bell, Вы писали:

B>Ага, смотрим 5.19/1

B>

B>...
B>In particular, except in sizeof expressions, functions, class objects, pointers, or
B>references shall not be used, and assignment, increment, decrement, function-call, or comma operators shall
B>not be used.

B>И никакого колдовства

Я не возмущаюсь, но для меня это действительно новость. Никогда раньше не приходилось сталкиваться. Гейзенбаг
... << RSDN@Home 1.2.0 alpha rev. 655>>
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[2]: Аналог do{...} while(0)
От: MShura  
Дата: 12.11.07 18:24
Оценка:
A>
A>do {} while (0, 0);
A>


Для gcc (4.1.2) такой код выдает warning:
"left-hand operand of comma has no effect"

что легко давится так:
do {} while ((void)0, 0);


Этот же код не вызывает проблем и на cl.
Re: Аналог do{...} while(0)
От: rg45 СССР  
Дата: 12.11.07 21:34
Оценка: :)
Здравствуйте, Осенний дождь, Вы писали:

ОД>[snipped]

ОД>Использование конструкции do{...}while(0) дает следующие преимущества:
ОД>[snipped]

Может быть я, как это часто бывает, чего-то недопонял, но, все же, чем конструкция: do{/*...*/}while(0) по своему эффекту отличается от простого операторного блока: {/*...*/}?
Никогда не говори "никогда". Всегда говори "иногда".
--
Re[2]: Аналог do{...} while(0)
От: Roman Odaisky Украина  
Дата: 12.11.07 21:42
Оценка:
Здравствуйте, rg45, Вы писали:

R>Может быть я, как это часто бывает, чего-то недопонял, но, все же, чем конструкция: do{/*...*/}while(0) по своему эффекту отличается от простого операторного блока: {/*...*/}?


Так рядом этот вопрос уже задавали: http://rsdn.ru/forum/message/2724374.1.aspx
Автор: quodum
Дата: 09.11.07
.
До последнего не верил в пирамиду Лебедева.
Re[3]: Аналог do{...} while(0)
От: Demon Россия  
Дата: 13.11.07 05:07
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

R>>Может быть я, как это часто бывает, чего-то недопонял, но, все же, чем конструкция: do{/*...*/}while(0) по своему эффекту отличается от простого операторного блока: {/*...*/}?


RO>Так рядом этот вопрос уже задавали: http://rsdn.ru/forum/message/2724374.1.aspx
Автор: quodum
Дата: 09.11.07
.


Протестую. Там это не было вопросом. Более того, я четко сам сказал: "Правда в этом случае ты можешь не ставить ;". Не нужно меня дискредитировать.
Re: Аналог do{...} while(0)
От: Formidable  
Дата: 13.11.07 06:53
Оценка: -1 :)
Здравствуйте, Осенний дождь, Вы писали:


ОД>Добрый день


ОД>При написании многих своих программ я использую макросы следующего вида


ОД>
ОД>#define MACRO_NAME(x) \
ОД>   do{
ОД>  ...do something...
ОД>  }while(0)

ОД>


ОД>...

ОД>При компиляции проекта с уровнем предупреждений 4 (/W4) компилятор выдает предупреждения о использовании константы в качестве условия цикла (warning C4127: conditional expression is constant).

Если ты врешь компилятору, то компилятор будет мстить (с)

Вообще не надо подменять функции макросами, тем боле что есть inline и template<>.
Re: Аналог do{...} while(0)
От: VsevolodC Россия  
Дата: 13.11.07 07:21
Оценка:
поробуй с if'ом, предупреждений по поводу цикла не будет
здесь
Автор: VsevolodC
Дата: 01.02.05
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.