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
next prev 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