Занимательная задачка: однократный вызов

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А чем так плох флаг?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ничем. Это была просто занимательная задачка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Код: Выделить всё

void foo() {
  static struct Bar {
    Bar() {
      method1();
    }
  } bar;
  method2();
}
Вариант с статической переменной плох тем что возникает race condition в многопоточном коде. Если сделать через локальный класс, то там при включенной многопоточной сборке добавляется неявный барьер и race не происходит.
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это какой такой компилятор неявный барьер на инициализация локального статического объекта делает? В стандарте про такое ничего не сказано, насколько я знаю. Или я отстал от жизни? Где это описано, можно ссылочку? Может 14-й стандарт? Я его ещё не штудировал глубоко, только по верхам посмотрел.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Да, действительно "magic static" реализован только в gcc. Но давно, уже 10 лет. На Вижуалке только начиная с 2015.

http://blogs.msdn.com/b/vcblog/archive/ ... eview.aspx
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Круто, однако...

Как итог: задача из занимательной превратилась в насущную :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

вот как раз-таки вариант предложенный сишником (не++) будет падать или непредсказуемо работать в многопоточном коде )))
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

Код: Выделить всё

bool FunctionWithCodeA() {
   <CodeA>
   return true; // или false пофиг )
}

void Function() {

   static const bool once __attribute__((unused)) = FunctionWithCodeA();
   <CodeB> 
}
а можно даже так:

Код: Выделить всё

void Function()  {                                                                  
                                                          
       struct Function {                                                              
           static const bool WithCodeA() {
              <CodeA>                                            
               return true;                                                           
           }                                                                          
       };                                                                             

       static const bool once __attribute__((unused)) = Function::WithCodeA();                                                                                                                                                                                                   

      <CodeB> 
} 
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Последний вариант полностью анологичен моему варианту, со вложенным классом.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

Сорри твоего варианта не нахожу. Это не тот ли, что на с++11 ?
если да, то требование было на c++98!

кстати (2) вариант с структурой внутри ф-ции не оч хорош, может иметь подводные камни, если там будут использоваться внешние static переменные, взятые из основного кода, особенно на вижуал студио.

Вот как вспомню пример, напишу, юзал VS2008.
Ответить