This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: prototyping functions returning an enum, before the enum is defined


| "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;
		/* ... */
	}



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]