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();