Einar,
To p[ut #DEFINEs in perspective for you think of them as Search and Replace functions. #DEFINE tells the COMPILER to search for the #DEFINEd name and replace ti with the value. This occurs at compile time and NOT at run time. There is no concept of exiting the procedure for #DEFINEs as the procedure is NOT running when the #DEFINEs are processed, the code is being compiled when they are processed. The purpose of #UNDEF is as explained by one of the other replies, to undefine a constant so you can do something else with that name in the compiler directives. It is also usefull is you are using #IFs to check for #DEFINEs and you want a certain procedure to undefine a constant.