Вычисление функций во время компиляции

Опубликовано в M4

Зачем вычислять 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)

 

 

 

 

Таким же образом можно на этапе сборки рассчитывать препроцессором любые другие несложные функции.

См. также Вычисление констант препроцессором

Библиотека