C preprocessor
Giorgos Keramidas
keramida at ceid.upatras.gr
Wed Nov 3 11:19:35 EET 2010
On Wed, 3 Nov 2010 10:57:29 +0200, Aravanis Konstantinos <kos.arav at gmail.com> wrote:
> Για την ακρίβεια ο κώδικας είναι με διορθωμένο και το while... δλδ ένα
> ερωτηματικό στο τέλος...
>
> #include <stdio.h>
>
> #define fun(A,B) \
> do { \
> A.a = 5 + B.a; \
> A.b = -5 + B.b; \
> }while(0);
>
> typedef struct
> {
> int a;
> int b;
> }mytype_t;
>
> void main(void)
> {
> mytype_t mpla, mplo = {6,7};
> fun(mpla, mplo);
> printf("A = <%d, %d>\nB = <%d, %d>\n", mpla.a, mpla.b, mplo.a, mplo.b);
> }
Μικρή συμβουλή από κάποιον που έχει γράψει ΠΟΛΛΑ function-like macros:
Συνήθως στα preprocessor macros που έχουν function-like μορφή _ΔΕΝ_
βάζουμε semicolon στο macro definition. ΠΟΤΕ. Θα το παρέχει το
σημείο στο οποίο θα καλέσουμε το macro μας.
Ο λόγος δεν είναι μόνο στυλιστικός, αλλά και συντακτικό τρυκ. Αν βάλεις
ερωτηματικό εσύ *και* υπάρχει ερωτηματικό στο σημείο που καλείται το
macro, τότε το παρακάτω δεν κάνει compile:
#define funlike(x) printf("x is %d\n", (x));
if (condition)
funlike(koko);
else
funlike(lala);
Επειδή ο preprocessor το κάνει expand σε κάτι που έχει ΔΥΟ semicolons:
if (condition)
printf("x is %d\n", (koko));;
else
printf("x is %d\n", (lala);;
Αντίθετα, αν αφήσεις το macro definition χωρίς semicolon, το expansion
είναι της μορφής:
if (condition)
printf("x is %d\n", (koko));
else
printf("x is %d\n", (lala);
Που κάνει compile μια χαρά.
More information about the Linux-greek-users
mailing list