Цитата(Метценгерштейн @ Jun 29 2015, 20:43)

может ли препроцессор заглянуть вниз и увидеть, что NUM ниже есть у него? По описанию- не должен, но реально Keil проглатывает это.
Препроцессору не нужно никуда заглядывать, для него директива
#define SUMM (NUM+8)
значит следующее: запомнить что если в разбираемом тексте попадётся лексема SUMM, то заменить её на
текст (NUM+8).
При этом препроцессору не нужно знать что из себя представляет этот NUM, для него это просто три буквы. Только и всего. Аналогично и со вторым макроопределением.
А вот когда ниже в тексте программы попадается имя макроопределения, то производится макроподстановка, после чего получившийся текст снова разбирается от начала макроподстановки и к этому тексту снова будут применяться имеющиеся на данный момент макроопределения, за исключением уже применённых (во избежание рекурсии). Хотя вот это место даже в стандарте описано так, что ничего непонятно.
Порядок появления макроопределений в данном случае не важен, главное чтобы они оба уже встретились до того как понадобится их применение.
Russia est omnis divisa in partes octo.