Off Topic: typedef declares object / enum to int
From: E. Robert Tisdale (E.Robert.Tisdale_at_jpl.nasa.gov)
Date: 02/23/05
- Next message: WUV999U: "Re: scripting"
- Previous message: G Patel: "Re: "extern" inside a block"
- In reply to: Martin: "typedef declares object / enum to int"
- Next in thread: Martin: "Re: Off Topic: typedef declares object / enum to int"
- Reply: Martin: "Re: Off Topic: typedef declares object / enum to int"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: Wed, 23 Feb 2005 12:08:58 -0800
Martin wrote:
> This post asks two questions, which I've illustrated in one C source file
> (see below), which clean compiles on my GNU compiler.
>
> 1. In K&R2, Section A8.9 it says "Declarations whose storage class specifier
> is typedef do not declare object." When I compile and run my sample code,
> the value "2" is displayed. Clearly the typedef has created the enumerators
> S1, S2, and S3. This appears to contradict K&R2.
No!
S1, S2 and S3 are *values* that an object of type an_enum_t can have.
They are *not* themselves objects.
> 2. The program below was created to emulate a Lint diagnostic
> [that] I got in a much larger project.
> In that project, the equivalent line to fn(SYMBOL) gives the warning
>
> Converting enum '{...}' to int
>
> which I find puzzling. Enumerators are int anyway, whereas the enumeration
> has an integral value (according to K&R2, Section A4.4). A warning about an
> enumerator (int) being converted to an int seems meaningless;
> and a warning about the enumeration (integral type) being converted to int
> doesn't make sense because it's the enumerator S3 that gets passed to fn().
> I've reproduced Lint's explanation of the warning below.
> cat main.c
// typedef declaration; Lint warning
#include <stdio.h>
typedef enum { S1, S2, S3 } an_enum_t;
#define SYMBOL S3
typedef unsigned int Word;
void fn(Word w) {
// deliberately empty
}
int main(int argc, char* argv[]) {
fn(SYMBOL);
printf("%i\n", SYMBOL);
return 0; // success
}
> gcc -Wall -std=c99 -pedantic -o main main.c
> ./main
2
> This is Lint's description of the warning:
>
> 641 Converting enum to int -- An enumeration type was used in a context that
> required a computation such as an argument to an arithmetic operator or was
> compared with an integral argument. This warning will be suppressed if you
> use the integer model of enumeration (+fie) but you will lose some valuable
> type-checking in doing so. An intermediate policy is to simply turn off this
> warning. Assignment of int to enum will still be caught.
>
> This warning is not issued for a tagless enum without variables. For example
>
> enum {false,true};
>
> This cannot be used as a separate type. PC-lint/FlexeLint recognizes this
> and treats false and true as arithmetic constants.
So your complaint is that lint is nitpicking?
- Next message: WUV999U: "Re: scripting"
- Previous message: G Patel: "Re: "extern" inside a block"
- In reply to: Martin: "typedef declares object / enum to int"
- Next in thread: Martin: "Re: Off Topic: typedef declares object / enum to int"
- Reply: Martin: "Re: Off Topic: typedef declares object / enum to int"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|