A #define-t precomplier dolgozza fel, "buta" stringmanipuláció alapú lecseréléssel dolgozik, a konkrét számértéket írja be mindenhova, ahol megtalálja a kulcsszó előfordulását.
A #define ezért mindennél "erősebb", mivel a fordítás előtti lépésben fut le. Ha ilyen van:
#define ONE 1
enum {
ONE
}
Akkor az a precompiler után ez lesz, és ez C nyelven értelmetlen, ez lesz a fordítási hiba:
enum {
1
}
Érdemes néha ránézni a precompiler kimenetére, amit a legtöbb fordító ki tud adni magából. Ez bár nehezen olvasható, de legalább meg lehet benne találni az ilyen hibákat: pl gcc -E.
Komolyabb helyeken a #define használata emiatt tilos is, mert nagyon könnyű öngyilkos aknákat csinálni vele.