I learned enums when I learned C and from time to time I keep myself reminding about it and most of the time by re-reading from some source,it occurred to me that this is d
Enums have one advantage over #define, but it's purely an implementation detail: debuggers typically can show/use enum values but #defined values.
On the other hand, #define has several fundamental advantages, one of which is that you can test for the existence with #ifdef. This is useful if you need to support multiple versions of a library, and want to optionally use new enum-like choices if they're available.
Some library authors use a hybrid approach of first defining the constants with enum then:
#define FOO FOO
#define BAR BAR
etc.