Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Условная компиляция макроса можно? Как? / 8 сообщений из 8, страница 1 из 1
11.06.2015, 08:26
    #38981787
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
Препроцессор умеет конкатенировать параметр макроса с текстом, получая при этом в т.ч. и новый макрос.

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

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

Код: plaintext
1.
2.
3.
#define _io_offset_ 0x20
#define some13   ((unsigned char *)0x26+_io_offset_)
#define macro(p) (some##p)



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

Код: plaintext
1.
#define macro(p) (defined(some##p)? some##p : someFunc(p))



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


ИЛИ
Код: plaintext
1.
2.
int myPinOut;
macro(myPinOut) => someFunc(myPinOut) ?



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

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

Модератор: Пользуйся тегами подветки исходного кода
...
Рейтинг: 0 / 0
11.06.2015, 08:31
    #38981793
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
Мне кажется вам поможет условная компиляция
...
Рейтинг: 0 / 0
11.06.2015, 12:47
    #38982132
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
SashaMercury,

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

Впрочем, если есть условная компиляция тела макроса, то да. Именно такой способ и спрашивал. Подскажете?
...
Рейтинг: 0 / 0
11.06.2015, 12:50
    #38982138
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
Arhat109,

Самое грустное, что в доке к gcc где-то читал что ТАК можно использовать предикат препроцессора defined() ... но вот avr-gcc матерится. Проверено.
...
Рейтинг: 0 / 0
11.06.2015, 14:56
    #38982345
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
Arhat109,
может быть тогда написать функцию, которая анализирует код программы на предмет присутствия макросов с определенными именами
...
Рейтинг: 0 / 0
11.06.2015, 16:43
    #38982518
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
SashaMercuryможет быть тогда написать функцию, которая анализирует код программы на предмет присутствия макросов с определенными именами
Может быть лучше поискать другие варианты решения задачи автора? Трансляторы
и так самодостаточны чтобы добавлять над ними еще новые логики и смыслы.
...
Рейтинг: 0 / 0
12.06.2015, 20:45
    #38983096
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
mayton,

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

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

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

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

Дело в том, что номера ног как-бы известны всем (можно посмотреть на плате), а вот таких аббревиатур там "видимо-невидимо" и лазить каждый раз в даташит ... как-то невесело.
...
Рейтинг: 0 / 0
12.06.2015, 21:06
    #38983103
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная компиляция макроса можно? Как?
Пиши свой Lisp. :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Условная компиляция макроса можно? Как? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]