Условная компиляция макроса можно? Как?

Arhat109
Дата: 11.06.2015 08:26:17
Препроцессор умеет конкатенировать параметр макроса с текстом, получая при этом в т.ч. и новый макрос.

Вопрос: можно ли реализовать макрос для "left side value" с условной разверткой, и в случае если конкатенированный макрос не найден, то вызвать функцию?

Примерно так:

#define _io_offset_ 0x20
#define some13   ((unsigned char *)0x26+_io_offset_)
#define macro(p) (some##p)


Вот вместо последней строчки что-то типа:

#define macro(p) (defined(some##p)? some##p : someFunc(p))


Чтобы на выходе препроцессора было
ИЛИ
#define internalLED 13
macro(internalLED) => ((unsigned char *)0x26+0x20)

ИЛИ
int myPinOut;
macro(myPinOut) => someFunc(myPinOut) ?


Надо для написания библиотеки к Ардуино, у которого в такие конструкции разворачиваются типовые макросы AVR-GCC, но в ряде случаев хотелось бы использовать переменный в памяти, а конкатенация практически "исключает" этот процесс...

... или есть иные решения?

Модератор: Пользуйся тегами подветки исходного кода
SashaMercury
Дата: 11.06.2015 08:31:24
Мне кажется вам поможет условная компиляция
Arhat109
Дата: 11.06.2015 12:47:47
SashaMercury,

Нет. Чтобы использовать условную компиляцию, мне надо перечислить в #ifdef все варианты значения параметра... это, для целых чисел в частности, просто нереально.

Впрочем, если есть условная компиляция тела макроса, то да. Именно такой способ и спрашивал. Подскажете?
Arhat109
Дата: 11.06.2015 12:50:02
Arhat109,

Самое грустное, что в доке к gcc где-то читал что ТАК можно использовать предикат препроцессора defined() ... но вот avr-gcc матерится. Проверено.
SashaMercury
Дата: 11.06.2015 14:56:44
Arhat109,
может быть тогда написать функцию, которая анализирует код программы на предмет присутствия макросов с определенными именами
mayton
Дата: 11.06.2015 16:43:04
SashaMercury
может быть тогда написать функцию, которая анализирует код программы на предмет присутствия макросов с определенными именами

Может быть лучше поискать другие варианты решения задачи автора? Трансляторы
и так самодостаточны чтобы добавлять над ними еще новые логики и смыслы.
Arhat109
Дата: 12.06.2015 20:45:54
mayton,

Нет там "других" решений. Программирование микроконтроллеров AVR, по крайней мере, сильно завязано на даташит камня. А он весь в таких вот абревиатурах TCCR0A -- управляющий регистр (адрес в памяти) "А" счетчика-таймера 0. И компилятору даны эти макросы практически "изначально".

А у Ардуино, ещё и ноги пронумерованы "от фонаря": 13 нога платы - это выход "А", таймера 0, а 2-я - выход "В" таймера 3 ...

Вот и захотелось "странного": сделать макрос, позволяющий по номеру ноги платы получать такой вот, практически встроенный макрос. Типа "загрузить предел счета по 2-й ноге платы числом 127" => timerOut(2, 127); ... надо преобразовать в использование типового макроса такого: OCR3B = 127;

... вот если задавать ногу числом, то можно считать "сделал". А вот ежели номер ноги платы лежит в переменной ... то фиг. Надо вызывать функцию... как?

Дело в том, что номера ног как-бы известны всем (можно посмотреть на плате), а вот таких аббревиатур там "видимо-невидимо" и лазить каждый раз в даташит ... как-то невесело.
mayton
Дата: 12.06.2015 21:06:09
Пиши свой Lisp. :)