Замена на замену или как размножить параметры макроса препроцессора - C (СИ)
Формулировка задачи:
Здравствуйте!
Сразу прошу прощения,я использую немного не тот С...Я его в компиляторе микроконтроллера использую. Там своя специфика,но мой вопрос,я думаю,общий. Обратился именно сюда потому как моя братия сдалась и называет меня дураком. Я такой и есть,если честно,но упёртый.
Теперь сабж: мне нужно решить раз и навсегда,возможно ли параметры макроса использовать в следующих подстановках. Попытаюсь объяснить. Если бы препроцессор не считал меня дураком (это уже традиция!),то выглядело это бы примерно так:
#define INITIALIZE(Par1,Par2,Par3) #define PORT Par1 #define PIN Par2 #define VAL Par3
Затем я вызываю:
INITIALIZE(0x01,0x02,0x03)
И получаю:
#define PORT 0x01
#define PIN 0x02
#define VAL 0x03
Что это всё именно в этом виде недопустимо я понимаю,хотя бы потому что препроцессор ругается.
Но можно ли эту задачу решить как-то иначе,только исключительно силами препроцессора? Я понимаю,что мог бы создать что-то вроде #define INITIALIZE(Par1,Par2,Par3) unsigned short int PORT=Par1,PIN=Par2,VAL=Par3; но это будут переменные,которых очень ограниченное количество,очень. И каждая дороже часов,потраченных на поиски элегантного решения.
Я пытаюсь понять конструкции типа
#define AAA BBB 1
#define BBB CCC 2
#define CCC AAA 3
и иногда кажется,что понимаю,но не имея практического примера тут же забываю что я понял.
Возможно ли один раз получив параметры одним скопом,не используя переменные,передать препроцессору ряд заданных значений для многократного использования?
Спасибо и простите,если что не так...
Решение задачи: «Замена на замену или как размножить параметры макроса препроцессора»
textual
Листинг программы
#define INITIALIZE(Par1,Par2,Par3) enum { PORT = (Par1), PIN = (Par2), VAL = (Par3) } /* дальше в коде*/ INITIALIZE(0x01,0x02,0x03);
Объяснение кода листинга программы
В данном коде определен макрос INITIALIZE, который принимает три аргумента типа int (Par1, Par2, Par3). Далее, внутри макроса, определено перечисление (enum) с тремя элементами (PORT, PIN, VAL), значения которых равны значениям переданных аргументов. Список элементов кода:
-
define INITIALIZE(Par1,Par2,Par3) enum { PORT = (Par1), PIN = (Par2), VAL = (Par3) }
- INITIALIZE(0x01,0x02,0x03);
Обоснование:
- Макрос INITIALIZE определен на строке 1 с тремя аргументами типа int.
- Внутри макроса, на строке 1, определено перечисление с тремя элементами и присвоены значения аргументам.
- На строке 2 макрос INITIALIZE вызывается с аргументами 0x01, 0x02 и 0x03.
- Значения аргументов передаются в макрос и используются для инициализации перечисления.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д