comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <Stephe.Leake@nasa.gov>
Subject: Re: How to Emulate C++ Macro with Static Local Variable?
Date: 25 Sep 2003 09:41:01 -0400
Date: 2003-09-25T13:43:50+00:00	[thread overview]
Message-ID: <uhe310yvm.fsf@nasa.gov> (raw)
In-Reply-To: ullsdvo26.fsf@sandia.gov

taashlo@sandia.gov writes:

> What happens is that when you do this:
> 
> BAR(10);
> 
> it expands to this:
> 
> if (1) {
>   static s t_;
>   bar(&t_, 10);
> } else ((void)0);
> 
> This, in effect, creates a (hidden) static local variable for each call
> to bar().  This static variable (actually a structure, t_) is used to
> cache information for each unique call to bar() such that subsequent
> calls from that location can be processed *much* faster.

Just declare each "hidden static" variable directly, and call 'bar'. 

Yes, it's a few more lines of code, but it's worth it!

> for (int i = 0; i < 55; ++i) {
>    switch (wozit()) {
>       case 1: BAR(10); break;
>       case 2: BAR(20); break;
>       case 3: BAR(30); break;
>    }
> }

This would become:

package foo
    t_1 : s;
    t_2 : s;
    t_3 : s;

procedure Something is
begin
    for i in 1 .. 54 loop
       case wozit is
       when 1 =>
           bar (t_1, 10);
       when 2 =>
           bar (t_2, 20);
       when 3 =>
           bar (t_3, 30);
       end case;
    end loop;
end Something;

end foo;

You may complain this is using "ugly global variables", and it is. So is the
C code. Using macros to hide doesn't really make it prettier :).

A better way is to make 't' part of a state object that is passed in
to Something, but that's left as an exercise for the reader.

-- 
-- Stephe



  parent reply	other threads:[~2003-09-25 13:41 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-24 22:06 How to Emulate C++ Macro with Static Local Variable? taashlo
2003-09-24 23:44 ` Robert I. Eachus
2003-09-25  3:27   ` Hyman Rosen
2003-09-25  4:53     ` tmoran
2003-09-25 15:57       ` Robert I. Eachus
2003-09-25 19:09         ` tmoran
2003-09-29 14:57           ` taashlo
2003-09-29 18:12             ` Jeffrey Carter
2003-09-29 18:51               ` taashlo
2003-09-30  1:32                 ` Jeffrey Carter
2003-09-30  1:54                   ` tmoran
2003-09-30 13:02                   ` taashlo
2003-09-30 20:25                     ` Jeffrey Carter
2003-09-30  2:45             ` Robert I. Eachus
2003-09-30  3:24               ` tmoran
2003-09-25 13:43     ` Stephen Leake
2003-09-25 12:59   ` Tad Ashlock
2003-09-25 16:11     ` Robert I. Eachus
2003-09-25 18:13       ` Randy Brukardt
2003-09-25 23:40         ` Robert I. Eachus
2003-09-25 11:54 ` Gautier
2003-09-25 16:14   ` Robert I. Eachus
2003-09-25 18:06   ` Tad Ashlock
2003-09-28  8:42     ` Gautier Write-only
2003-09-28 20:06       ` Jeffrey Carter
2003-09-29  2:13         ` Gautier Write-only
2003-09-25 13:41 ` Stephen Leake [this message]
2003-09-25 17:23   ` Tad Ashlock
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox