A #define
вызов макроса расширяется до тех пор, пока не останется больше терминов для расширения, за исключением того, что он не повторяется. Например:
#define TIMES *
#define factorial(n) ((n) == 0 ? 1 : (n) TIMES factorial((n)-1))
// Doesn't actually work, don't use.
Предположим, вы говорите factorial(2)
. Это расширится до ((2) == 0 ? 1 : (2) * factorial((2)-1))
. Обратите внимание, что factorial
расширяется, затем TIMES
также расширяется, но factorial
впоследствии не расширяется, поскольку это будет рекурсия.
Тем не менее, обратите внимание, что вложение (возможно, другой тип «рекурсии») фактически многократно расширяется в одном и том же выражении:
#define ADD(a,b) ((a)+(b))
....
ADD(ADD(1,2),ADD(3,4)) // expands to ((((1)+(2)))+(((3)+(4))))