By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,852 Members | 2,219 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,852 IT Pros & Developers. It's quick & easy.

enum question

P: n/a
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?

What I am trying to do is represent ASCII values 0-127 as TOKENs (this is
why I
started the TOKEN enum off at '1000' so I had plenty of space at the
start....and I don't
really want to type out 127 values into my enum declaration....can anybody
suggest
an alternate solution?

thanks,
James
Nov 15 '05 #1
Share this Question
Share on Google+
10 Replies


P: n/a

James Brown wrote:
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?

What I am trying to do is represent ASCII values 0-127 as TOKENs (this is
why I
started the TOKEN enum off at '1000' so I had plenty of space at the
start....and I don't
really want to type out 127 values into my enum declaration....can anybody
suggest
an alternate solution?

thanks,
James


In the expression:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

TOK_ID, TOK_NUMBER, and TOK_STRING are constant integer values. In this
case, TOK_ID is = 1000, then TOK_NUMBER is 1001. The reason why the
compiler is b-tching is because you are trying to modify the constant
integer TOK_NUMBER (which has a value of 1001).

Nov 15 '05 #2

P: n/a
"James Brown" <dont_bother> writes:
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?


The declaration "enum TOKEN { ... };" creates a type called
"enum TOKEN". It does not create a type called TOKEN.

Given the type declaration, the declaration
enum TOKEN t2 = 5;
is perfectly legal.

I suspect you're using a C++ compiler. C++ is a different language
with different rules; comp.lang.c++ is down the hall on the left.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Nov 15 '05 #3

P: n/a
"Chad" <cd*****@gmail.com> writes:
James Brown wrote:
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?

What I am trying to do is represent ASCII values 0-127 as TOKENs
(this is why I started the TOKEN enum off at '1000' so I had plenty
of space at the start....and I don't really want to type out 127
values into my enum declaration....can anybody suggest an alternate
solution?
In the expression:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };


That's a declaration, not an expression.
TOK_ID, TOK_NUMBER, and TOK_STRING are constant integer values. In this
case, TOK_ID is = 1000, then TOK_NUMBER is 1001.
Yes.
The reason why the
compiler is b-tching is because you are trying to modify the constant
integer TOK_NUMBER (which has a value of 1001).


Look again. There's nothing in the original poster's code that
attempts to modify TOK_NUMBER.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Nov 15 '05 #4

P: n/a

Keith Thompson wrote:
"James Brown" <dont_bother> writes:
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?


The declaration "enum TOKEN { ... };" creates a type called
"enum TOKEN". It does not create a type called TOKEN.

Given the type declaration, the declaration
enum TOKEN t2 = 5;
is perfectly legal.

I suspect you're using a C++ compiler. C++ is a different language
with different rules; comp.lang.c++ is down the hall on the left.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.


I'm calling an offsides on this one. Maybe I mis-understood the
question. I always thought when you has a construction like

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

Then TOK_NUMBER = 1001 and TOK_STRING = 1002. Both of these being
constant integers (Page 39 of the "C Programming Language" by K & R).
Hence these values could not be modified because they are constant.

Nov 15 '05 #5

P: n/a
Chad wrote:
Keith Thompson wrote:
"James Brown" <dont_bother> writes:
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?


The declaration "enum TOKEN { ... };" creates a type called
"enum TOKEN". It does not create a type called TOKEN.

Given the type declaration, the declaration
enum TOKEN t2 = 5;
is perfectly legal.

I suspect you're using a C++ compiler. C++ is a different language
with different rules; comp.lang.c++ is down the hall on the left.


I'm calling an offsides on this one. Maybe I mis-understood the
question. I always thought when you has a construction like

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

Then TOK_NUMBER = 1001 and TOK_STRING = 1002. Both of these being
constant integers (Page 39 of the "C Programming Language" by K & R).
Hence these values could not be modified because they are constant.


I am not sure what you mean.
The
enum TOKEN {
....
};
declaration gives us the type "enum TOKEN", quite like
struct foo {
....
};
gives us the type "struct foo".

So,
enum TOKEN t2;
t2 = 5;
or
enum TOKEN t2 = 5;
are structurally not different from
struct foo bar;
bar = baz;
or
struct foo bar = baz;
where baz is of type struct foo.

Declaring t2 certainly does not change any of the enumeration
constants, neither does initializing t2.
Cheers
Michael
--
E-Mail: Mine is an /at/ gmx /dot/ de address.
Nov 15 '05 #6

P: n/a

"Keith Thompson" <ks***@mib.org> wrote in message
news:ln************@nuthaus.mib.org...
"James Brown" <dont_bother> writes:
I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?


The declaration "enum TOKEN { ... };" creates a type called
"enum TOKEN". It does not create a type called TOKEN.

Given the type declaration, the declaration
enum TOKEN t2 = 5;
is perfectly legal.

I suspect you're using a C++ compiler. C++ is a different language
with different rules; comp.lang.c++ is down the hall on the left.

--
Keith Thompson (The_Other_Keith) ks***@mib.org
<http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*>
<http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.


Hi,
thanks for your answer - and you're right, I am using C++ but its useful for
me
to appreciate the differences....I'll repost on c.l.c++

thanks,
James
Nov 15 '05 #7

P: n/a
"Chad" <cd*****@gmail.com> writes:
Keith Thompson wrote:
"James Brown" <dont_bother> writes:
> I have the following enum declared:
>
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
>
> (it goes on and on like that)
>
> This is what I would like to do:
>
> TOKEN t1 = TOK_ID; // ok
> TOKEN t2 = 5; // compile error (cannot convert from
> const int to 'enum TOKEN')
> TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???
>
> could someone clarify if the 3rd example is ok or not, and what type
> of problem I might expect if it isn't ok?
The declaration "enum TOKEN { ... };" creates a type called
"enum TOKEN". It does not create a type called TOKEN.

Given the type declaration, the declaration
enum TOKEN t2 = 5;
is perfectly legal.

I suspect you're using a C++ compiler. C++ is a different language
with different rules; comp.lang.c++ is down the hall on the left.

[...] I'm calling an offsides on this one. Maybe I mis-understood the
question. I always thought when you has a construction like

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

Then TOK_NUMBER = 1001 and TOK_STRING = 1002. Both of these being
constant integers (Page 39 of the "C Programming Language" by K & R).
Hence these values could not be modified because they are constant.


Of course you can't modify TOK_NUMBER or TOK_STRING.

The posted code (see above) doesn't attempt to do so, and I don't see
anything that would lead you to believe that it does.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Nov 15 '05 #8

P: n/a
James Brown a écrit :
enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
Be sure you are using a C compiler. The C-language is not that strongly
typed. This line is fine C.
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???


It's fine C too.

--
C is a sharp tool
Nov 15 '05 #9

P: n/a
Emmanuel Delahaye wrote:
James Brown a écrit :
enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert
from const int to 'enum TOKEN')

Be sure you are using a C compiler. The C-language is not that strongly
typed. This line is fine C.
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

It's fine C too.


Ah. This is obviously some strange usage of the word
"fine" that I wasn't previously aware of.

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
TOKEN t1 = TOK_ID;
TOKEN t2 = 5;
TOKEN t3 = (TOKEN)5;

gcc -W -Wall -ansi -pedantic -c token.c
token.c:2: error: parse error before "t1"
token.c:2: warning: type defaults to `int' in declaration of `t1'
token.c:2: error: ISO C forbids data definition with no type or storage
class
token.c:3: error: parse error before "t2"
token.c:3: warning: type defaults to `int' in declaration of `t2'
token.c:3: error: ISO C forbids data definition with no type or storage
class
token.c:4: error: parse error before "t3"
token.c:4: warning: type defaults to `int' in declaration of `t3'
token.c:4: error: `TOKEN' undeclared here (not in a function)
token.c:4: error: parse error before numeric constant

--
Eric Sosman
es*****@acm-dot-org.invalid
Nov 15 '05 #10

P: n/a
Eric Sosman a écrit :
enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???


It's fine C too.


Ah. This is obviously some strange usage of the word
"fine" that I wasn't previously aware of.


Ah sh*t, I missed the 'enum' word... Sorry about that.

--
C is a sharp tool
Nov 15 '05 #11

This discussion thread is closed

Replies have been disabled for this discussion.