Ορισμοί Μακροεντολών

Ο ορισμός μιάς μακροεντολής είναι επιφανειακά ίδιος με τον ορισμό μιάς σταθεράς. 
Έχουμε πάλι δύο συμβολοσειρές όπου η πρώτη αποτελεί συνώνυμο της δεύτερης και 
ο μεταφραστής προβαίνει στις σχετικές αντικαταστάσεις κατά την μετάφραση του 
προγράμματος. Ορισμοί μακροεντολών είναι οι δύο τελευταίες εντολές #define του 
προγράμματος. Η διαφορά του ορισμού σταθεράς και μακροεντολής γίνεται 
κατανοητή από το επόμενο παράδειγμα.

Με βάση τον πρώτο ορσιμό μακροεντολής η πρόταση

mx = MAX(index,count)

του προηγούμενου προγράμματος (DEFINE.C) αντικαθίσταται από την πρόταση

mx = ((index)>(count)?(index):(count)).

Τι έχει συμβεί; Η πρώτη συμβολοσειρά του ορισμού περιέχει το όνομα της 
μακροεντολής, MAX, συνοδευόμενο από ένα ζέυγος παρενθέσεων, μέσα στο οποίο 
υπάρχουν οι 'τυπικές παράμετροι' της μακροεντολής με ονόματα Α και Β. Οι τυπικές 
αυτές παράμετροι χρησιμοποιούνται στη δεύτερη συμβολοσειρά η οποία δεν είναι 
τίποτε άλλο από μιά εκτελέσιμη πρόταση της C, συγκεκριμένα μιά έκφραση υπό 
συνθήκη. Όταν ο μεταφραστής βρεί το όνομα της μακροεντολής τότε προσπαθεί να 
συνδέσει τις 'τυπικές παραμέτρους' της με αντίστοιχες 'πραγματικές παραμέτρους'. 
Αυτές οι πραγματικές παράμετροι χρησιμοποιούνται και στη δεύτερη συμβολοσειρά, 
δηλαδή στην εκτελέσιμη πρόταση. Το αποτέλεσμα του προγράμματος δίνεται αμέσως

Max is 5 and min is 0
Max is 5 and min is 1
Max is 5 and min is 2
Max is 5 and min is 3
Max is 5 and min is 4
Max is 5 and min is 5
Max is 6 and min is 5
Max is 7 and min is 5
Max is 8 and min is 5
Max is 9 and min is 5

Όπως είναι φανερό το όνομα της μακροεντολής πρέπει να ακολουθείται αμέσως από 
τις παρενθέσεις, αλλοιώς ο ορισμός χάνει το νόημά του. Σημειώστε οτι τυχόν σχόλια 
ή μηνύματα δεν επηρρεάζονται από τη μακροεντολή. Σημειώστε τις πολλαπλές 
παρενθέσεις στον ορισμό της έκφρασης υπό συνθήκη. Η αναγκαιότητά τους εξηγείται 
αμέσως μετά.
Λάθος μακροεντολές

Το πρόγραμμα που είναι αποθηκευμένο στο αρχείο MACRO.C παρουσιάζει ορισμένους 
λανθασμένους ορισμούς μακροεντολών. Τα λάθη οφείλονται σε πλειμμελή χρήση των 
παρενθέσεων. 
                                     
Το πρόγραμμα περιέχει πέντε ορισμούς μακροεντολών, δύο γιά την ύψωση ενός 
αριθμού στη τρίτη δύναμη (λάθος και σωστό), έναν γιά ύψωση αριθμού στο τετράγωνο 
και δύο γιά τον διπλασιασμό  ενός αριθμού (λάθος και σωστό).

Γιά να γίνουν αντιληπτά τα λάθη στους ορισμούς ας δούμε τις αντικαταστάσεις που 
θα πραγματοποιήσει ο μεταφραστής στον πίνακα που ακολουθεί 

SQUR(i+offset)	(i+offset)*(i+offset)	
CUBE(i+offset)	(i+offset)*(i+offset)*(i+offset)
WRONG(i+offset)	i+offset*i+offset*i+offset

5*ADD_WRONG(i)	5*i+i
5*ADD_RIGHT(i)	5*(i+i)

Είναι προφανές οτι τα λάθη οφείλονται στο γεγονός οτι στους λανθασμένους 
ορισμούς δεν έχουν ληφθεί υπόψη οι προτεραιότητες των αριθμητικών τελεστών. 
Αυτό γίνεται ακόμη πιό κατανοητό από το αποτέλεσμα της εκτέλεσης του 
προγράμματος που ακολουθεί.

The square of   6 is   36, and its cube is    216
The wrong of    6 is     16
The square of   7 is   49, and its cube is    343
The wrong of    7 is     27
The square of   8 is   64, and its cube is    512
The wrong of    8 is     38
The square of   9 is   81, and its cube is    729
The wrong of    9 is     49
The square of  10 is  100, and its cube is   1000
The wrong of   10 is     60
The square of  11 is  121, and its cube is   1331
The wrong of   11 is     71
The square of  12 is  144, and its cube is   1728
The wrong of   12 is     82

Now try the addition macro's
Wrong addition macro =      6, and right =     10
Wrong addition macro =     12, and right =     20
Wrong addition macro =     18, and right =     30
Wrong addition macro =     24, and right =     40
Wrong addition macro =     30, and right =     50
Wrong addition macro =     36, and right =     60
Wrong addition macro =     42, and right =     70

Γιά να αποφύγουμε τέτοια λάθη καλύτερα να βάζουμε λίγες παραπάνω παρενθέσεις 
στους ορισμούς μακροεντολών έτσι ώστε να αίρεται κάθε αμφισβήτηση.

Περιεχόμενα Κεφαλαίου