#define es un comando preprocesador, enum es en el C o Lenguaje C++.
Siempre es mejor utilizar enumeraciones sobre #define para este tipo de casos. Una cosa es seguridad tipo. Otra es que cuando tienes una secuencia de valores solo tienes que dar el comienzo de la secuencia en la enumeración, los otros valores obtienen valores consecutivos.
enum {
ONE = 1,
TWO,
THREE,
FOUR
};
en lugar de
#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
Como nota lateral, todavía hay algunos casos en los que pueda tener para usar #define (normalmente algún tipo de macros, si tiene que ser capaz de construye un identificador que contiene la constante), pero eso es una especie de macro magia negra, y muy raro que sea el camino a seguir. Si vas a estas extremidades, probablemente deberías usar una plantilla de C++ (pero si estás atrapado con C ...).
También se puede poner en enumeraciones espacios de nombres, mientras que las macros no pueden ser. –
Sin embargo, las macros se pueden configurar más fácilmente fuera del código fuente mismo (por ejemplo, desde dentro del comando de compilación) –