Δημοσιεύτηκε: 08 Μαρ 2012, 20:16
από migf1
Ηλία θυμάσαι που λέγαμε πότε μας συμφέρει να χρησιμοποιήσουμε macros και πότε συναρτήσεις; Πόσταρα πριν λίγο στο νήμα του HexView ένα απόσπασμα από τον κώδικα, από την διαχείριση των skins (συγκεκριμένα εδώ: http://forum.ubuntu-gr.org/viewtopic.ph ... 51#p234351 ).

Στη συνάρτηση που φτιάχνει το μαύρο skin, θα δεις πως όλη η δουλειά γίνεται με ένα macro, το CONOUT_CPYCLR( dst, src) το οποίο αντιγράφει το 2ο όρισμά του στο 1ο (αντιγράφει δηλαδή το χρώμα src στο χρώμα dst).

Επειδή τα χρώματα σε Windows είναι unsigned 32μπιτά int, αλλά σε ANSI mode είναι c-strings (πίνακες χαρακτήρων) τότε ή πρέπει να φτιαχτούν 2 διαφορετικές συναρτήσεις για το κάθε mode ή θα το κάνουμε με macro, το οποίο θα το καλούμε όπου κι όποτε θέλουμε, ανεξάρτητα από το σε ποιο mode βρισκόμαστε (μια 3η επιλογή είναι χρησιμοποιήσουμε union).

Ο κώδικας του εν λόγω macro είναι ο παρακάτω (είναι λίγο διαφορετικά στο HexView, γιατί είναι σε ξεχωριστό header-file, από μα συλλογή με macros για cross-platform χρωματισμούς σε κονσόλα, που είχα φτιάξει παλαιότερα)...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#if defined( CON_COLOR_WIN32 )
#define CONOUT_CPYCLR( dst, src ) \
( (dst) = (src) )

#elif defined(CON_COLOR_ANSI)
#define CONOUT_CPYCLR( dst, src ) \
memmove( (dst), (src), ( 1 + strlen((src)) ) * sizeof(char) )

#else
#define CONOUT_CPYCLR( dst, src ) /* void macro */
#endif

Γίνεται και με συναρτήσεις, αλλά θέλει (αρκετή έως πολύ) περισσότερη δουλειά.

ΥΓ. Πόσταρα και screen-shots από 4 skins στο νήμα του HexView :)