Занимательная задачка: однократный вызов
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
А чем так плох флаг?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Ничем. Это была просто занимательная задачка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Код: Выделить всё
void foo() {
static struct Bar {
Bar() {
method1();
}
} bar;
method2();
}
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Да, действительно "magic static" реализован только в gcc. Но давно, уже 10 лет. На Вижуалке только начиная с 2015.
http://blogs.msdn.com/b/vcblog/archive/ ... eview.aspx
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
вот как раз-таки вариант предложенный сишником (не++) будет падать или непредсказуемо работать в многопоточном коде )))
Код: Выделить всё
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Сорри твоего варианта не нахожу. Это не тот ли, что на с++11 ?
если да, то требование было на c++98!
кстати (2) вариант с структурой внутри ф-ции не оч хорош, может иметь подводные камни, если там будут использоваться внешние static переменные, взятые из основного кода, особенно на вижуал студио.
Вот как вспомню пример, напишу, юзал VS2008.
если да, то требование было на c++98!
кстати (2) вариант с структурой внутри ф-ции не оч хорош, может иметь подводные камни, если там будут использоваться внешние static переменные, взятые из основного кода, особенно на вижуал студио.
Вот как вспомню пример, напишу, юзал VS2008.