У меня есть этот код, который работает:C препроцессора с использованием закрывающей скобки родителя макросъемки
#include <stdio.h>
#define A(x) x B
#define B(x) C(x,
#define C(x,y) y x)
int main(void) {
printf(A("1") ("2") "3");
}
Он печатает 132
(в точке A
макроса поменять вещь, которая следует его параметрам в скобках со всем после этого до другого закрывающей скобки)
Но если я использую это в другой макрос:
#define Z(x) x
printf(Z(A("1") ("2") "3"));
Я получаю ошибку компиляции Msgstr "Неограниченный функциональный вызов макроса".
Я понимаю, что это происходит потому, что компилятор пытается обрабатывать аргументы Z
самостоятельно, но мне нужно использовать его закрывающую скобку в качестве маркера. Есть ли способ сделать эту работу внутри макросов? Изменение синтаксиса вызова на самом деле не является вариантом.
p.s. Прежде чем я получу какие-либо ответы, расскажу о том, что ужасно, что нужно делать, будьте уверены: это не настоящий код. Это проблема, возникшая при создании игрушечной программы, которая использует define
для моделирования нового языка внутри C.
Спасибо за подробное объяснение. К сожалению, решение не применимо к моей точной проблеме (мне все еще нужны другие макросы внутри Z для расширения). Что касается M4, хорошо, если бы это был настоящий проект, я бы согласился, но задача состоит в том, чтобы сделать это с причудливым препроцессором C! Как связанный вопрос, можно ли использовать скобки '()' вместо '[]'? то есть есть способ избежать символов скобок? – Dave
Я не понимаю ваш родственный вопрос. Я просто использовал квадратные скобки для иллюстрации; что касается препроцессора, они не имеют никакого особого значения. – zwol
Я имею в виду эту строку: '#define C (x, y) y x]/* обратите внимание на квадратную скобку вместо закрытого символа * /' как ')', она ломается. – Dave