enumからintへの変換(int(VALUE_A)など)は、自動的に/透過的に行われます。
intからenum(En(ValA)など)への変換は、int値がenumの有効なメンバーであることを確認するための健全性チェックの恩恵を受けることができます。(ただし、ライブラリコードは、そもそも列挙値が有効である とは想定していません。)
「intx」の場合には役立ちませんが、次のように変更することで多少役立つことがあります。
#define ValA 5
に:
#define ValA VALUE_A
列挙型En()がどこにでも含まれ/定義されている場合、ValAとVALUE_Aの両方が、foo (int)とbar(En)の両方で自動的に/透過的に機能します。
あなたが使用することができます:
#ifdef ValA
STATIC_ASSERT( ValA == VALUE_A, ValA_equal_VALUE_A );
#undef ValA
#else
#warning "ValA undefined. Defining as VALUE_A"
#endif
#define ValA VALUE_A
STATIC_ASSERTは次のようなものです。
/* Use CONCATENATE_4_AGAIN to expand the arguments to CONCATENATE_4 */
#define CONCATENATE_4( a,b,c,d) CONCATENATE_4_AGAIN(a,b,c,d)
#define CONCATENATE_4_AGAIN(a,b,c,d) a ## b ## c ## d
/* Creates a typedef that's legal/illegal depending on EXPRESSION. *
* Note that IDENTIFIER_TEXT is limited to "[a-zA-Z0-9_]*". *
* (This may be replaced by static_assert() in future revisions of C++.) */
#define STATIC_ASSERT( EXPRESSION, IDENTIFIER_TEXT) \
typedef char CONCATENATE_4( static_assert____, IDENTIFIER_TEXT, \
____failed_at_line____, __LINE__ ) \
[ (EXPRESSION) ? 1 : -1 ]