我正在try 构建一个X宏,它允许使用一堆有用的函数(例如.toString()
)生成枚举.我得到的版本可以这样实现:
#define MAKE_ENUM \
ENUM_NAME( LanguageId ) \
ENUM_TYPE( unsigned int ) \
ENUM_ENTRY( English, 0 )\
ENUM_ENTRY( French ) \
ENUM_ENTRY( German ) \
ENUM_ENTRY( Italian ) \
ENUM_ENTRY( Spanish ) \
ENUM_ENTRY( Polish ) \
ENUM_ENTRY( Korean, 128 ) \
ENUM_ENTRY( ChineseTraditional, 129 ) \
ENUM_ENTRY( ChineseSimplified, 130 ) \
ENUM_ENTRY( Japanese, 131 )
#include "GenericToolbox.MakeEnum.h"
#undef MAKE_ENUM
X宏MAKE_ENUM
的部署在头GenericToolbox.MakeEnum.h
下完成.
到目前为止,这个版本的工作与预期的一样.但是,我希望ENUM_TYPE
是一个可选参数,因此有时它不会由用户设置,而枚举将被定义为默认的int
.
为此,我需要弄清楚MAKE_ENUM的展开是否为空.我想到的版本是这样的:
#define TEMP_EXPAND(x) x
#define TEMP_SELECT_THIRD(_1,_2,num,...) num
#define TEMP_IS_NOT_EMPTY_IMPL(...) TEMP_EXPAND(TEMP_SELECT_THIRD(__VA_ARGS__,1,0))
#define TEMP_ARGS_DUMMY( ... ) dummy,##__VA_ARGS__
#define TEMP_IS_NOT_EMPTY( val ) TEMP_IS_NOT_EMPTY_IMPL(TEMP_ARGS_DUMMY( val ))
// [...]
#define ENUM_TYPE(type_) type_ // MAKE_ENUM will only return type_ if it exists
#if TEMP_IS_NOT_EMPTY( MAKE_ENUM ) == 1
typedef MAKE_ENUM EnumType;
#else
typedef int EnumType;
#endif
// [...]
The issue is that it seems the 100 macro only works with Clang but not GCC. Do you have any idea why? And would there be a viable workaround?
为了澄清这个问题,我用代码添加了一个测试:
#define MAKE_ENUM_EMPTY
#if TEMP_IS_NOT_EMPTY( MAKE_ENUM_EMPTY ) == 1
// NOT empty
#warning "TEMP_IS_NOT_EMPTY does not work correctly for empty macro"
#else
// empty
#endif
#define MAKE_ENUM_NOT_EMPTY unsigned int
#if TEMP_IS_NOT_EMPTY( MAKE_ENUM_NOT_EMPTY ) == 1
// NOT empty
#else
// empty
#warning "TEMP_IS_NOT_EMPTY does not work correctly for NOT empty macro"
#endif
使用GCC时,我得到警告消息:#warning "TEMP_IS_NOT_EMPTY does not work correctly for empty macro"
干杯!