Тут недавно Алкоголь-студия проверяла код FreeBSD (ищите на хабре, не собираюсь добавлять ссылок этим спамерам), так вот. Там такое место есть:
#ifdef Q
#undef Q
#endif
#define Q(_r) \
(((_r) == 1.5) ? 0 : (((_r) ==2.25) ? 1 : (((_r) == 3) ? 2 : \
(((_r) == 4.5) ? 3 : (((_r) == 6) ? 4 : (((_r) == 9) ? 5 : \
(((_r) == 12) ? 6 : (((_r) == 13.5)? 7 : 0))))))))
static const struct txschedule series_quarter[] = {
{ 3,Q( 1.5),3,Q(1.5), 0,Q(1.5), 0,Q(1.5) }, /* 1.5Mb/s */
{ 4,Q(2.25),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) }, /*2.25Mb/s */
{ 4,Q( 3),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) }, /* 3Mb/s */
{ 4,Q( 4.5),3,Q( 3), 4,Q(1.5), 2,Q(1.5) }, /* 4.5Mb/s */
{ 4,Q( 6),3,Q(4.5), 4,Q( 3), 2,Q(1.5) }, /* 6Mb/s */
{ 4,Q( 9),3,Q( 6), 4,Q(4.5), 2,Q(1.5) }, /* 9Mb/s */
{ 4,Q( 12),3,Q( 9), 4,Q( 6), 2,Q( 3) }, /* 12Mb/s */
{ 4,Q(13.5),3,Q( 12), 4,Q( 9), 2,Q( 6) } /*13.5Mb/s */
};
#undef Q
Разворачивается это чудо в
static const struct txschedule series_quarter[] = {
{ 3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
{ 4,(((2.25) == 1.5) ? 0 : (((2.25) ==2.25) ? 1 : (((2.25) == 3) ? 2 : (((2.25) == 4.5) ? 3 : (((2.25) == 6) ? 4 : (((2.25) == 9) ? 5 : (((2.25) == 12) ? 6 : (((2.25) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
{ 4,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
{ 4,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))),3,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
{ 4,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))),3,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))), 4,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
{ 4,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))),3,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))), 4,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
{ 4,(((12) == 1.5) ? 0 : (((12) ==2.25) ? 1 : (((12) == 3) ? 2 : (((12) == 4.5) ? 3 : (((12) == 6) ? 4 : (((12) == 9) ? 5 : (((12) == 12) ? 6 : (((12) == 13.5)? 7 : 0)))))))),3,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))), 4,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))), 2,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))) },
{ 4,(((13.5) == 1.5) ? 0 : (((13.5) ==2.25) ? 1 : (((13.5) == 3) ? 2 : (((13.5) == 4.5) ? 3 : (((13.5) == 6) ? 4 : (((13.5) == 9) ? 5 : (((13.5) == 12) ? 6 : (((13.5) == 13.5)? 7 : 0)))))))),3,(((12) == 1.5) ? 0 : (((12) ==2.25) ? 1 : (((12) == 3) ? 2 : (((12) == 4.5) ? 3 : (((12) == 6) ? 4 : (((12) == 9) ? 5 : (((12) == 12) ? 6 : (((12) == 13.5)? 7 : 0)))))))), 4,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))), 2,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))) }
};
Так вот. Что, блин мешает написать
static const struct txschedule series_quarter[] = {
{ 3, 0, 3, 0, 0, 0, 0, 0 }, /* 1.5Mb/s */
{ 4, 1, 3, 0, 4, 0, 0, 0 }, /* 2.25Mb/s */
{ 4, 2, 3, 0, 4, 0, 0, 0 }, /* 3Mb/s */
{ 4, 3, 3, 2, 4, 0, 2, 0 }, /* 4.5Mb/s */
{ 4, 4, 3, 3, 4, 2, 2, 0 }, /* 6Mb/s */
{ 4, 5, 3, 4, 4, 3, 2, 0 }, /* 9Mb/s */
{ 4, 6, 3, 5, 4, 4, 2, 2 }, /* 12Mb/s */
{ 4, 7, 3, 6, 4, 5, 2, 4 }, /* 13.5Mb/s */
};
Зачем нужна нафиг магия на макросах? Напишите блин рядом комментарий что мол так и так, массив сформирован на основе четвертинного алгоритма. Все равно этот ваш Q(XXX) нихрена не понятен. Понятно, что потом всякие Водка-Студии будут орать 96 критикал сообщений о несовместимости типов.
В коде FreeBSD можно встретить ещё несколько таких массивов. Суммарно анализатор выдаёт на них 692 предупреждения уровня High. Напомню, что всего предупреждений уровня High насчитывается 3577. Это значит, что такие макросы приводят к возникновению 1/5 этих предупреждений.
P.S. Код, которым я сгенерил массив выше: https://pastebin.com/pPN8uwVz