2016-12-29 62 views
-1

我在读从JsonParser的代码,我想知道这个枚举是如何工作的:你能解释一下这个枚举声明吗?

enum JsonTag { 
    JSON_NUMBER = 0, 
    JSON_STRING, 
    JSON_ARRAY, 
    JSON_OBJECT, 
    JSON_TRUE, 
    JSON_FALSE, 
    JSON_NULL = 0xF 
}; 
  • 这是否意味着NULL被定义为半个字节1111

  • 这是否意味着NUMBERNULL之间的每个值都将介于00xF之间?

  • 这是否意味着NULL是某种内存位置?

  • STRINGARRAY ...是什么值?

  • 为什么要用这种方式声明一个枚举?

+4

它只是意味着'JSON_NULL'是15,没有什么好笑的是 – harold

+4

当一个枚举入口没有明确的值分配给它时,它会比分配给前一个入口的值多一个。 – jaggedSpire

+0

@Quentin我认为你的编辑方式改变了这个问题。OP似乎不明白JSON_前缀的意义。 –

回答

3

这是否意味着JSON_NULL被定义为半字节1111?

值0x0F(十六进制)是十进制的15和二进制的1111。

这是否意味着JSON_NUMBER和JSON_NULL之间的每个值都将介于0和0xF之间?

不一定。分配的enum值与范围无关。
enum标识不具有特定的值,它将使用前值+ 1

这是否意味着JSON_NULL是某种内存位置的?

只有这意味着你可以得到的是该标识符JSON_NULL被分配值15.没有什么说明任何标识的目的。

JSON_STRING,JSON_ARRAY ...会是什么值?

这里是标识符的值:

enum JsonTag { 
/* 0 */ JSON_NUMBER = 0, 
/* 1 */ JSON_STRING, 
/* 2 */ JSON_ARRAY, 
/* 3 */ JSON_OBJECT, 
/* 4 */ JSON_TRUE, 
/* 5 */ JSON_FALSE, 
/* 15 */ JSON_NULL = 0xF 
}; 

为什么声明枚举这种方式?

一个原因是有序列符号,并允许一个不连续的符号。也许作者没有定义15个符号,但只有前6个。JSON_NULL似乎有一个特殊的值15,所以它是这样列出的。

您可能想要了解json数据规范中的JSON对象类型。

+0

谢谢,真的为我清除它! –

5

这很简单。枚举值可以明确指定或隐式定义。当明确指定时 - 例如JSON_NULL - 他们只是有这个值。在这种情况下,它是15.(不知道为什么在这里使用花式十六进制符号)。

当隐含分配,他们总是等于先前的枚举值+ 1,第一个值被设置为0。

而且,为了以防万一,全名是定义在那里。不NULL,但JSON_NULL,不NUMBER,但JSON_NUMBER

0

0xF仅有15以十六进制(十进制) - 什么特别的地方。枚举条目要么显式赋值,要么先前条目的值加1。这里没有什么奇怪的,枚举只有6个值从0到5,然后最终值编号为15.共计7个值,编号为0,1,2,3,4,5,15。为什么这个编号?我不知道;问任何写代码的人。

0
  • 这是否意味着NULL被定义为半字节1111?

否,在一般情况下,除非明确指定底层枚举类型是一个int。这种情况下的值只是0xF - 在那里没有半字节。

  • 这是否意味着在数量和NULL之间的每一个值是0和0xF之间?

它将从JSON_NUMBER = 0开始并增加一个,直到JSON_FALSE,然后JSON_NULL这将是0xF

  • 这是否意味着NULL是某种内存位置的?

  • 什么会STRING,ARRAY的价值......是什么?

如前所述。

  • 为什么要用这种方式声明一个枚举?

通常为具有可被用作undefinedinvalid的值。它可以表示执行某个函数时发生错误,因此枚举值未设置为有效条目。