Более удобный способ выполнения кода только один раз на C?

#c #boolean #conditional

#c #логическое значение #условный

Вопрос:

У меня часто есть код вида:

 uint8_t bool_var = 0;

for (;;) {
    ...
    if (!bool_var) {
       do_something();
       bool_var = 1;
    }
    ...
}
  

Существует ли более краткий, не макросный способ выражения условия if и блока?

Комментарии:

1. Вам придется расширить контекст, потому что код в целом будет выполняться только один раз, если вы не сделаете что-то, чтобы заставить его работать снова, например, поместить его в цикл.

2. Для меня выглядит идеально читаемым и кратким. В C вы могли бы проделать некоторые трюки с функторами, но в обычном C все, что короче, сделает его загадочным IMO.

3. @DavideVisentin — Значит, только не вводите этот блок снова для 255 итераций?

4. @DavideVisentin Я думал об этом, но в конечном итоге это завершится, особенно на ATmegas с uin8_t s.

5. если вы исключаете макросы для скрытия кода, я думаю, что это лучший способ. Если у вас есть for(int i=0; i<...; i) , вы можете удалить логическую переменную и заменить ее на if (i==0) but other than that …

Ответ №1:

Ваш код настолько удобочитаем и прост, насколько это возможно для большинства случаев.


Однако для очень специфических целей вы можете оказаться в ситуации, когда вы хотите всегда вызывать функцию, но иногда без эффекта. Тогда, возможно, имеет смысл использовать какой-нибудь трюк с указателями на функции:

 typedef void func_t (void);
...
func_t* do_stuff = do_something;
... 

while(stuff) // this code can't be changed for whatever reason
{
  do_stuff();
}
  

В таком сценарии вы можете придумать это:

 void nop (void) {}
...
do_stuff = nop;
  

Теперь вы можете продолжать вызывать do_stuff , но ничего не произойдет.