Home > Archive > C > October 2005 > enum question
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
|
|
| James Brown 2005-10-22, 6:55 pm |
| 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
| |
|
|
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).
| |
| Keith Thompson 2005-10-22, 6:55 pm |
| "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) kst-u@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.
| |
| Keith Thompson 2005-10-22, 6:55 pm |
| "Chad" <cdalten@gmail.com> writes:
> James Brown wrote:
>
> 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) kst-u@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.
| |
|
|
Keith Thompson wrote:
> "James Brown" <dont_bother> writes:
>
> 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) kst-u@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.
| |
| Michael Mair 2005-10-22, 6:55 pm |
| Chad wrote:
> Keith Thompson wrote:
>
>
> 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.
| |
| James Brown 2005-10-22, 6:55 pm |
|
"Keith Thompson" <kst-u@mib.org> wrote in message
news:lnvezpe1g2.fsf@nuthaus.mib.org...
> "James Brown" <dont_bother> writes:
>
> 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) kst-u@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
| |
| Keith Thompson 2005-10-22, 9:55 pm |
| "Chad" <cdalten@gmail.com> writes:
> Keith Thompson wrote:
[...][color=darkred]
> 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) kst-u@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.
| |
| Emmanuel Delahaye 2005-10-30, 6:56 pm |
| 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
| |
| Eric Sosman 2005-10-31, 7:55 am |
| Emmanuel Delahaye wrote:
> James Brown a écrit :
>
>
>
> Be sure you are using a C compiler. The C-language is not that strongly
> typed. This line is fine C.
>
>
>
> 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
esosman@acm-dot-org.invalid
| |
| Emmanuel Delahaye 2005-10-31, 6:56 pm |
| Eric Sosman a écrit :
>
> 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
|
|
|
|
|