Alexey111
Dec 14 2005, 11:52
Задача такова:
необходимо написать макрос, который в случае его запуска с константой в качестве параметра выполняет одно действие, а в случае передачи ему переменной другое.
Смысл этого в следующем: необходимо умножить число на константу. Константа заранее известна(1000). Число может быть заданной константой(тогда это выражение надо подсчитать на этапе компиляции), или переменной(тогда необходимо вызвать ф-у умножения числа на константу).
Вызов ф-ции стоит дешевле, чем умножение двух чисел.
Все это нужно для экономии места во флеше, борьба за каждый байт!
P.S Язык "Ansi С"
Процессор специализированный, т.е не ARM
Alex03
Dec 14 2005, 21:17
В GCC бывает семейство builtin* функций, и тогда возможно такое (из их примера):
#define Scale_Value(X) \
(__builtin_constant_p (X) \
? ((X) * SCALE + OFFSET) : Scale (X))
В С++ возможно прокатило бы 2 перегруженные inlune функции с одним именем, у одной параметр const у другой нет.
В большинстве современных трансляторов с языка С на платформе арм имеется средство инлайнирования -- это либо модификатор функции либо соответствующая прагма. Для примера можно посмотреть AT91LIB на сайте атмела, она выпускается как минимум в трех вариантах IAR,ADS12,Multi3.2.
Alexey111
Dec 15 2005, 13:06
Спасибо за ответы.
Похоже проблема с компилятором, он происходит от GCC но портирован на на свой процессор фирмой изготовителем камня и пока особых возможностей у него я не заметил.
Надеялся на свое неполное знание ANSI C, может в нем что-то предусмотрели на этот случай.
Буду искать в документации компилятора.
Alexey111
Jan 20 2006, 09:27
Цитата(Alex03 @ Dec 15 2005, 01:17)

В GCC бывает семейство builtin* функций, и тогда возможно такое (из их примера):
#define Scale_Value(X) \
(__builtin_constant_p (X) \
? ((X) * SCALE + OFFSET) : Scale (X))
В С++ возможно прокатило бы 2 перегруженные inlune функции с одним именем, у одной параметр const у другой нет.
Не поверил документации на компилятор - проверил. Работает!
Спасибо.
Вообще этот самопальный компилятор протирован с GCC 2.6 или 2.9(точной информации нет) и документация неполная.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.