TGViewer
C++: Хроники Дурки🚑 C++: Хроники Дурки🚑 @cpp_durka · 916 subscribers
Post #29 893
Что бы вы сказали, найдя в коде вот такой кусок?


if(0){}else


Ну, первое предположение было бы, что мы как-то хотим макросы заиспользовать, например:


if (0) {}
#if GCC
else if (gcc_comparison())
{
gcc_action();
}
#endif
#if CLANG
else if (clang_comparison())
{
claing_action();
}
#endif


И какую бы мы переменную не поставили - не будет ошибки компиляции из-за else перед if.

Но вот вам реализация foreach в QT для компиляторов от майкрософта (когда-то была, в последних версиях, очевидно, другая, и вообще не рекомендуется к использованию с версии Qt5.7).

И такую же реализацию можно найти в других проектах, наример, MAP_FOREACH в DynaMind Toolbox.


Note: Since Qt 5.7, the use of this macro is discouraged. Use C++11 range-based for, possibly with std::as_const(), as needed.





#define Q_FOREACH(variable, container) \

if (0) else
for (const QForeachContainerBase &_container_ = qForeachContainerNew(container); \
qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->condition(); \
++qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i) \
for (variable = *qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i; \
qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk; \
--qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk)



На кой черт оно тут?

А это следствие старого бага в VS 6: там внутри for цикла переменные не ограничивались в области видимости. Вот какой-то такой код нормально бы скомпилировался.


int main() {
for (int i = 0; i < 3; ++i) {
std::cout << i << std::endl;
}
std::cout << i << std::endl;
return 0;
}


А почему не сделать тогда if(true) ? А потому что тогда бы сработало


Q_FOREACH(a, b)
else {
// ...
}


Вот такую хрень в допотопные времена приходилось добавлять в код.

Как славно, что те времена давно прошли, и у нас на повестке новая дурка.
А вы в комментариях пишите (ну или загуглите), зачем нужен в этом макросе тернарный оператор:


qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->condition();
GitHub qtbase/src/corelib/global/qforeach.h at fb9f4444fa716f6aa93d3d13d3037b30c005d7a7 · qt/qtbase Qt Base (Core, Gui, Widgets, Network, ...). Contribute to qt/qtbase development by creating an account on GitHub.
  • 🥴 5
  • 🔥 3
More from @cpp_durka
  1. Sep 8, 2026Мошенники заставили пенсионерку из Москвы переписать квартиру на Rust
  2. Aug 31, 2026Всяко разное болезненное есть в С++, из всего болезненного одно из самых болезненных - это…
  3. Aug 24, 2026Если кто не знаком с библиотекой nlohmann/json - она прекрасна. Мои мысли о том, как должн…
  4. Aug 21, 2026#толькосвоимемы Код взят тут. if (dim == 0) idx_dim = i0; else if (dim == 1) idx_dim = i1;…
  5. Aug 17, 2026Ладно, искать баги в компиляторах весело, но недостаточно. Давайте поиграемся в чуть более…
  6. Aug 10, 2026Ладно, разумеется прошлый пост был набросом. Никогда не обновляйте компиляторы без очень с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →