Вычисление функций во время компиляции
Зачем вычислять ColorRGB(255,0,255) во время выполнения программы, если это неизменное число?
По порядку.
1. Вооружаемся препроцессором M4
2. Узнаем, все ли параметры функции есть константы-числа. Макрос выглядит так:
define(`m4_is_number',`eval(m4_regexp(`$1',`^[0-9]+$')==0)')
m4_is_number(123) | 1 |
m4_is_number(abc) | 0 |
m4_is_number("xy") | 0 |
3. Теперь "переопределяем" функцию ColorRGB :
define(`ColorRGB',`ifelse(eval(m4_is_number(`$1') && m4_is_number(`$2') && m4_is_number(`$3')),1,`eval(0x10000 *`$3' + 0x100 * `$2' + `$1')',``$0'($*)')')
Если все три параметра - константы, вычисляем результат сразу, в момент сборки программы препроцессором. Если хотя бы один параметр не является константой, то оставляем все как есть и рассчитываем ColorRGB во время исполнения программы.
4. Итак, что мы имеем с гуся?
ColorRGB(255,0,0) | 255 (или 0x0000FF) |
ColorRGB(a,b,c) | ColorRGB(a,b,c) |
ColorRGB(1,2,c) | ColorRGB(1,2,c) |
ColorRGB(eval(0xFF),0,255) | 16711935 (или 0xFF00FF) |
Таким же образом можно на этапе сборки рассчитывать препроцессором любые другие несложные функции.
См. также Вычисление констант препроцессором