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

Опубликовано в 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)

 

 

 

 

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

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

Добавить комментарий


Защитный код
Обновить

Библиотека