确保枚举符合unsigned char [英] Making sure an enum fits into an unsigned char

查看:72
本文介绍了确保枚举符合unsigned char的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我有一个用C语言编写的UNIX服务器,用Java客户端交换消息

。在消息中,1字节是它的长度,

第2个玩家号码,第3个字节是事件ID:


/ * 0. byte:总消息长度(以字节为单位)(包括此字节)* /

/ * 1.字节:播放器编号(0,1或2)* /

/ * 2.字节:事件ID(10 - 22)* /

/ * 3.-255。:参数(252字节或126个大端UTF-16字符)* /


typedef unsigned char byte;


typedef struct {

byte len,

num,

id,

arg [MAXARG];

} msg;


对于事件ID我目前使用#defines :


#define PREF_NAME 10

#define PREF_PASS 11

#define PREF_CHAT 12

#定义PREF_CARD 13


但我实际上更喜欢使用枚举,例如:


enum event_id {

PREF_NAME = 10,

PRE F_PASS,

PREF_CHAT,

PREF_CARD

}


但是枚举是整数,不是''他们?可以

我以某种方式指定我的枚举只有8位长吗?


还有一个问题:你如何使用typedef'和enum'的?

我试图更改此代码:


enum direction {

FROM,

to

};


void print_node(unsigned i,unsigned j,enum direction dir,const node

* np );


以下,但得到奇怪的无关错误消息

(我怀疑我在那里声明了一个变量方向):


typedef enum {

FROM,

TO

}方向;

void print_node(unsigned i,unsigned j,direction dir,const node * np);


谢谢

Alex


PS:我在OpenBSD 3.7上使用gcc 3.3.5。

Hi,

I have a UNIX-server written in C, which exchanges messages
with Java clients. In the message the 1 byte is its length,
the 2nd a player number and the 3rd byte is an event id:

/* 0. byte: Total message length in bytes (inlcuding this byte) */
/* 1. byte: Player number (0, 1 or 2) */
/* 2. byte: Event id (10 - 22) */
/* 3.-255.: Argument (252 bytes or 126 big-endian UTF-16 chars) */

typedef unsigned char byte;

typedef struct {
byte len,
num,
id,
arg[MAXARG];
} msg;

For the event ids I currently use #defines:

#define PREF_NAME 10
#define PREF_PASS 11
#define PREF_CHAT 12
#define PREF_CARD 13

But I would actually prefer to use enums instead, something like:

enum event_id {
PREF_NAME = 10,
PREF_PASS,
PREF_CHAT,
PREF_CARD
}

However enums are integers, aren''t they? Could
I somehow specify that my enums are 8 bit long only?

One more question: how do you use typedef''s with enum''s?
I''ve tried to change this code:

enum direction {
FROM,
TO
};

void print_node(unsigned i, unsigned j, enum direction dir, const node
*np);

To the following, but get strange unrelated error messages
(I suspect that I declare a variable "direction" there instead):

typedef enum {
FROM,
TO
} direction;

void print_node(unsigned i, unsigned j, direction dir, const node *np);

Thank you
Alex

PS: I''m using gcc 3.3.5 on OpenBSD 3.7.

推荐答案

#enum event_id {

#PREF_NAME = 10,

#PREF_PASS,

#PREF_CHAT,

#PREF_CARD

#}



#但枚举是整数,不是'他们呢?可以

#我以某种方式指定我的枚举只有8位长?


使用byte而不是enum event_id。


字节变量= PREF_NAME;


这是允许的,假设PREF_NAME在值范围内

字节可以容纳,则不会丢失价值。

#还有一个问题:你如何在enum'中使用typedef?

#我试图更改此代码:



#enum direction {

#FROM,

#TO

#} ;



#void print_node(unsigned i,unsigned j,enum direction dir,const node

#* np);



#以下,但得到奇怪的无关错误消息

#(我怀疑我在那里声明了一个变量方向):



#typedef enum {

#FROM,

#TO

#}方向;


如果你想更好的合作控制方向分配

对象,你可以使用

typedef字节方向;

代替。


没有看到错误信息,很难猜到。 typedef

是否继续引用类型名称。


-

SM Ryan http://www.rawbw.com/~wyrmwif/

你讨厌人们。

但我喜欢聚会。不具讽刺意味。
# enum event_id {
# PREF_NAME = 10,
# PREF_PASS,
# PREF_CHAT,
# PREF_CARD
# }
#
# However enums are integers, aren''t they? Could
# I somehow specify that my enums are 8 bit long only?

Use byte instead of enum event_id.

byte variable = PREF_NAME;

This is allowed and assuming PREF_NAME is in the range of values
byte can hold, there will be no loss of value.
# One more question: how do you use typedef''s with enum''s?
# I''ve tried to change this code:
#
# enum direction {
# FROM,
# TO
# };
#
# void print_node(unsigned i, unsigned j, enum direction dir, const node
# *np);
#
# To the following, but get strange unrelated error messages
# (I suspect that I declare a variable "direction" there instead):
#
# typedef enum {
# FROM,
# TO
# } direction;

If you want to better control over the allocation of direction
objects, you can use
typedef byte direction;
instead.

Without seeing the error message, it''s hard to guess. Does the typedef
proceed any reference to the type name.

--
SM Ryan http://www.rawbw.com/~wyrmwif/
You hate people.
But I love gatherings. Isn''t it ironic.




Alexander Farber写道:

Alexander Farber wrote:


/ * 0.字节:总消息长度(以字节为单位)(包含此内容) byte)* /
/ * 1.字节:播放器编号(0,1或2)* /
/ * 2.字节:事件ID(10 - 22)* /
/ * 3.-255。:参数(252字节或126个大端UTF-16字符)* /

typedef unsigned char byte;

typedef struct {
byte len,
num,
id,
arg [MAXARG];
} msg;

对于事件ID我目前使用#defines:

#define PREF_NAME 10
#define PREF_PASS 11
#define PREF_CHAT 12
#define PREF_CARD 13

但我其实更愿意使用枚举,比如:

enum event_id {
PREF_NAME = 10,
PREF_PASS,
PREF_CHAT,
PREF_CARD
}
然而,枚举是整数,不是吗?


C99草案中可能对你有帮助的行情:


枚举:

限制因素:

....

"枚举器列表中的标识符是

声明为类型为int的常量和

可能出现在允许的任何地方......


和脚注:

实施可能会延迟选择哪个

整数类型,直到所有枚举常量都显示为


可以
我以某种方式指定我的枚举只有8位长?


你为什么要这样?

还有一个问题:你如何在enum'中使用typedef'?
我'我试图改变这段代码:

enum direction {


typedef enum direction {FROM,
TO
};


}方向;

应该有效。

void print_node(unsigned i,unsigned j,enum direction dir,const node
* np);

对于以下内容,但得到奇怪的无关错误消息
(我怀疑我在那里声明了一个变量方向):


可能的,使用你的文本编辑器的搜索选项到剑柄;-)

但枚举有自己的命名空间,甚至包括:


typedef enum _myBool {FALSEY,TRUEY} _myBool;

void demo(_myBool f)

{

int _myBool;

/ *以下是摆脱未使用的变量警告* /

f =!f;

_myBool = 1;

}


int main()

{

}


编译(使用gcc -std = c99 -W -Wall -pedantic),没有任何警告。

如果你发布了错误信息,它会很方便。

typedef enum {
FROM,
T O
}方向;


也应该有效! void print_node(unsigned i,unsigned j,direction dir,const node * np);

谢谢
Alex

PS:我正在使用gcc 3.3 .5在OpenBSD 3.7上。
Hi,

I have a UNIX-server written in C, which exchanges messages
with Java clients. In the message the 1 byte is its length,
the 2nd a player number and the 3rd byte is an event id:

/* 0. byte: Total message length in bytes (inlcuding this byte) */
/* 1. byte: Player number (0, 1 or 2) */
/* 2. byte: Event id (10 - 22) */
/* 3.-255.: Argument (252 bytes or 126 big-endian UTF-16 chars) */

typedef unsigned char byte;

typedef struct {
byte len,
num,
id,
arg[MAXARG];
} msg;

For the event ids I currently use #defines:

#define PREF_NAME 10
#define PREF_PASS 11
#define PREF_CHAT 12
#define PREF_CARD 13

But I would actually prefer to use enums instead, something like:

enum event_id {
PREF_NAME = 10,
PREF_PASS,
PREF_CHAT,
PREF_CARD
}

However enums are integers, aren''t they?
Quotes from the C99 draft that might help you:

Enum:
Constraints:
....
"The identifiers in an enumerator list are
declared as constants that have type int and
may appear wherever such are permitted..."

and a footnote:
"An implementation may delay the choice of which
integer type until all enumeration constants have
been seen."
Could
I somehow specify that my enums are 8 bit long only?
Why would you want that?
One more question: how do you use typedef''s with enum''s?
I''ve tried to change this code:

enum direction {
typedef enum direction { FROM,
TO
};
} direction;
should work.

void print_node(unsigned i, unsigned j, enum direction dir, const node
*np);

To the following, but get strange unrelated error messages
(I suspect that I declare a variable "direction" there instead):

Possible, use your text editor''s search option to the hilt ;-)
But enums have their own namespace, and even the following:

typedef enum _myBool { FALSEY, TRUEY } _myBool;
void demo( _myBool f )
{
int _myBool;
/* following are to get rid of unused variable warning */
f = !f;
_myBool = 1;
}

int main()
{
}

compiles (with gcc -std=c99 -W -Wall -pedantic) without any warnings.
Had you posted the error message(s), it would have been handy.
typedef enum {
FROM,
TO
} direction;
Should work as well! void print_node(unsigned i, unsigned j, direction dir, const node *np);

Thank you
Alex

PS: I''m using gcc 3.3.5 on OpenBSD 3.7.



HTH


HTH


Alexander Farber写道:
Alexander Farber wrote:
我有一个用C语言编写的UNIX服务器,它与Java客户端交换消息。在消息中,1字节是其长度,第2个是播放器编号,第3个字节是事件ID:
/ * 0.字节:总消息长度(以字节为单位)(包含此字节)* /
/ * 1.字节:播放器编号(0,1或2)* /
/ * 2.字节:事件ID(10 - 22)* /
/ * 3.-255 。:参数(252字节或126个big-endian UTF-16字符)* /
typedef unsigned char byte;
typedef struct {
byte len,
num,
id,
arg [MAXARG];
} msg;
I have a UNIX-server written in C, which exchanges messages
with Java clients. In the message the 1 byte is its length,
the 2nd a player number and the 3rd byte is an event id:
/* 0. byte: Total message length in bytes (inlcuding this byte) */
/* 1. byte: Player number (0, 1 or 2) */
/* 2. byte: Event id (10 - 22) */
/* 3.-255.: Argument (252 bytes or 126 big-endian UTF-16 chars) */
typedef unsigned char byte;
typedef struct {
byte len,
num,
id,
arg[MAXARG];
} msg;




你怎么知道字段之间没有填充?我建议

想一想。

-

Anton Petrusevich



How do you know that there''s no padding between fields? I would suggest to
think about it.
--
Anton Petrusevich


这篇关于确保枚举符合unsigned char的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆