typedef declares object / enum to int

From: Martin (martin.o_brien_at_[no-spam)
Date: 02/23/05


Date: Wed, 23 Feb 2005 19:34:40 -0000

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.

2. The program below was created to emulate a Lint diagnostic 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.

/* 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( void )
{

   fn(SYMBOL);
   printf("%i\n", SYMBOL);
   return 0; /* success */
}

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.

-- 
Martin


Relevant Pages

  • Off Topic: typedef declares object / enum to int
    ... which clean compiles on my GNU compiler. ... Enumerators are int anyway, whereas the enumeration ... > and a warning about the enumeration being converted to int ...
    (comp.lang.c)
  • Re: typedef declares object / enum to int
    ... which clean compiles on my GNU compiler. ... Enumeration constants are exactly that: ... Enumerators are int anyway, whereas the enumeration ... > enumerator being converted to an int seems meaningless; and a warning ...
    (comp.lang.c)
  • const, typedef, and warning
    ... The following code compiles with a warning this way ... Why can I not use my typedef pst? ...
    (comp.lang.c)
  • Re: I dont understand typedef example
    ... As a word of warning, typedef can only be used to declare the type of ... function typedef can include the function's ... typedef int func; ...
    (comp.lang.c)
  • xemacs installation problems
    ... checking for gcc... ... checking whether we are using GNU C... ... checking size of int... ... configure: warning: No OffiX without generic Drag'n'Drop support ...
    (comp.os.linux.misc)