Замена на замену или как размножить параметры макроса препроцессора - 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), значения которых равны значениям переданных аргументов. Список элементов кода:

  1. define INITIALIZE(Par1,Par2,Par3) enum { PORT = (Par1), PIN = (Par2), VAL = (Par3) }

  2. INITIALIZE(0x01,0x02,0x03); Обоснование:
    • Макрос INITIALIZE определен на строке 1 с тремя аргументами типа int.
    • Внутри макроса, на строке 1, определено перечисление с тремя элементами и присвоены значения аргументам.
    • На строке 2 макрос INITIALIZE вызывается с аргументами 0x01, 0x02 и 0x03.
    • Значения аргументов передаются в макрос и используются для инициализации перечисления.

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы