将enum 转换为 int,例如 int(VALUE_A),会自动/透明地发生。
将int 转换为 enum,例如En(ValA),可以从完整性检查中受益,以确保int值是枚举的有效成员。 (虽然希望库代码不假设它的枚举值首先是有效的。)
虽然它对“ int x ”情况没有帮助,但您可以通过更改来有所帮助:
#define ValA 5
到:
#define ValA VALUE_A
如果enum 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 ]