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