From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michael Meissner To: ghazi@caip.rutgers.edu, schwab@issan.informatik.uni-dortmund.de Cc: egcs@cygnus.com Subject: Re: prototyping functions returning an enum, before the enum is defined Date: Mon, 29 Jun 1998 20:41:00 -0000 Message-id: <199806291946.PAA03102@tiktok.cygnus.com> X-SW-Source: 1998-06/msg01080.html | "Kaveh R. Ghazi" 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; /* ... */ }