Вам нужно пройти каждый этап во время разрешения. По сути, препроцессор выполняет итеративный поиск и замену до тех пор, пока у него не закончатся токены (он может быть более сложным, но для текущих целей именно так и происходит). На каждой строке слева направо.
Теперь, что происходит с использованием набора 2:
printf("%d", D(A));
<- первый найденный токен препроцессора <code>D(A), поэтому:
printf("%d", CA);
printf("%d", 2);
То, что происходит с сетом 1:
printf("%d", D(A));
<- первый найденный токен препроцессора <code>D(A), поэтому:
printf("%d", B(A));
<- теперь следующий найденный токен <code>A
printf("%d", B(1));
printf("%d", C1);
<- и ошибка </li>
Проблема в том, что происходит замена, тогда препроцессор находит следующий A
(возможно, не перезапускает строку) и выполняет другую замену. Затем он снова проходит через это, но находит B(1)
.
Чтобы проверить это, вы можете просто пропустить некоторые из последующих объявлений и выполнить предварительную обработку в файл. Это покажет вам точно, что происходит.