on1 construct

Brad Spear brad at sdcrdcf.UUCP
Thu Nov 8 05:03:04 AEST 1984


In article <124 at cadvax> jacob at cadvax.UUCP (Jacobo Bulaevsky) writes:
>I've started functions in the following way:
>
>function ()
>{
>    static char first_time_in = TRUE;
>
>    if (first_time_in)  {
>        first_time_in = FALSE;
>	bla, bla, bla...
>    };
>
>    etc...
>}

Your letter got me to thinking, I have to start some procedures that way also.
The following is what I came up with.  I tested it with the simple program
that follows, and it appeared to work, so we'll see.

#define TRUE    1
#define FALSE   0
#define ON_FIRST_TIME   static char _done = FALSE; if (!_done && (_done=TRUE))

main()
{       int j;

	for (j = 0; j < 3; j++) sub();
}

sub()
{
	ON_FIRST_TIME printf ("inside init\n");
	printf("routine call\n");
}

Note that ON_FIRST_TIME would be treated like any 'if' statement, so just
put in some '{}', and off you go.  The only restriction is that it must
be the first expression in a block, because of the declaration of done.

Note that if the expression "!_done" evaluates to FALSE, which it does after
the first time, the expression "(_done=TRUE)" will not be re-evaluated.

If you want an expression that doesn't use a hidden variable, you might try
this one, although I haven't tested it.

#define ON_FIRST_TIME(x)        if (!(x) && ((x)=TRUE))

In this case, the variable used for x would already have to be declared, but
it also allows the macro to be used anywhere.

Brad Spear
sdcrdcf!brad



More information about the Comp.lang.c mailing list