> defineはエラーがあってもコンパイル時にエラーとして検出できませんし、

enumもたいがいのコンパイラーでエラーや警告でませんよ。

enumで定義した値以外を代入したり、
ちがうenumで定義した値を代入してもエラーや警告でない(gccあたりでためしてみて!)

そうするとdefineとたいしてちがいないのよね。
せいぜい(重複した値がないようにできるぐらいの利点しかない。