| Karim Belabas on Wed, 14 Jun 2006 18:34:01 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| do {...} while(0) macros |
Hi all,
in order to emulate templates in ANSI C, some of the pari code uses the
(standard, ugly) macro construct:
#define foo do { A; B; } while (0)
The point is
-- 1) to get a block in which to declare global variables
[ which A, B would not provide ]
-- 2) #define foo2 A; B is broken since
if (test) foo2
is interpreted as
if (test) A;
B;
which is not the intended behaviour
-- 3) #define foo3 { A; B; } is broken since
if (test) foo3; else whatever
is interpreted as
if (test) { A; B; };
else whatever ^------ BAD
Today, Henri Cohen has found yet another way to break the above foo
definition, which I had thought was more or less foolproof:
for (foo ;;) / for ( ;foo; ) / for (;; foo)
don't work since one is not allowed to use loops within initializer,
termination test or modifier parts of a 'for' statement.
This is especially annoying for the (deprecated) addsiz functions which
one might conceivably find in code such as
GEN i;
for ( i = N0; cmpii(i, N) < 0; addsiz(i, 1, i) )
( Which is inefficient and should be written differently, as all code
using the <fun>z functions, but this is beside the point. )
The simplest "solution" seems to generate most of paricom.h automatically
from a template [ see the "OPERATION BY VALUE" part ].
A seemingly better solution is to kill all (obsolete, inefficient,
difficult to use) <fun>z functions in pari-2.5.
An intermediate solution would be to simply document the problem (say as
a FAQ item) and forget about it.
Any idea ?
Cheers,
K.B.
--
Karim Belabas Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP]