This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: prototyping functions returning an enum, before the enum is defined
- To: ghazi at caip dot rutgers dot edu, schwab at issan dot informatik dot uni-dortmund dot de
- Subject: Re: prototyping functions returning an enum, before the enum is defined
- From: Michael Meissner <meissner at cygnus dot com>
- Date: Mon, 29 Jun 1998 15:46:40 -0400
- Cc: egcs at cygnus dot com
| "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu> writes:
|
| |> Some config/*/*.c files have extern functions returning an
| |> enum of some sort. Eg, function_arg_padding() in sparc.c which
| |> returns an `enum direction'. I'd like to be able to prototype these
| |> in sparc.h, but we don't have the definition of `enum direction' from
| |> expr.h yet.
| |>
| |> Is it legal in both KNR and ANSI C to say:
| |> > extern enum direction function_arg_padding();
| |>
| |> before `enum direction' has been defined?
| |>
| |> What about doing:
| |> > enum direction;
| |> > extern enum direction function_arg_padding();
|
| Both are wrong. ANSI C does not have forward declarations of enum types.
| >From the C9x draft (6.5.2.3 Tags):
|
| [#2] A type specifier of the form
|
| enum identifier
|
| without an enumerator list shall only appear after the type
| it specifies is completed.
|
| I'm pretty sure that this is unchanged from the current standard.
(the current standard is still the 1989/1990 standard).
What I've been doing is declaring the functions as taking an int instead of an
enum, and returning an int:
#ifndef RTX_CODE
struct rtx_def;
#define Rtx struct rtx_def *
#else
#define Rtx rtx
#endif
#ifndef TREE_CODE
union tree_node;
#define Tree union tree_node *
#else
#define Tree tree
#endif
extern int foo_operand PROTO((Rtx, int));
/* ... */
int
foo_operand (op, int_mode)
rtx op;
int int_mode;
{
enum machine_mode mode = (enum machine_mode)int_mode;
/* ... */
}