我在https://4coder.handmade.network/static/media/file/4coder/fcpp-lexer-1.1.zip中浏览了一个C源文件(4cpp_lexer_types.h),发现以下代码,无法理解其用途/优点。
#define ENUM(type,name) typedef type name; enum name##_
ENUM(uint32_t, Cpp_Token_Type){
CPP_TOKEN_JUNK = 0,
CPP_TOKEN_COMMENT = 1,
.
.
.
};
从#define中,我可以推断出该后期预处理的代码看起来像这样。
typedef uint32_t Cpp_Token_Type; enum Cpp_Token_Type_{
CPP_TOKEN_JUNK = 0,
CPP_TOKEN_COMMENT = 1,
.
.
.
};
为什么不像下面那样简单地 typedef 枚举?
typedef enum {
CPP_TOKEN_JUNK = 0,
CPP_TOKEN_COMMENT = 1,
.
.
.
}Cpp_Token_Type;
我两种情况的用法都相同:
Cpp_Token_Type t = CPP_TOKEN_JUNK;
所以我的问题是为什么这样做,这是针对某些特定结果的一些标准做法吗?
答案 0 :(得分:3)
在原始代码中,setupFiles: ['<rootDir>/src/test/globals-test.ts']
是Cpp_Token_Type
,而在简化中,uint32_t
是Cpp_Token_Type
类型。如果要创建类型为enum
的变量,则在两种情况下其行为将完全不同。例如,在您的示例中,Cpp_Token_Type
已使用您的定义签名,而原始签名未签名。