Δημοσιεύτηκε: 08 Μαρ 2012, 20:16
Ηλία θυμάσαι που λέγαμε πότε μας συμφέρει να χρησιμοποιήσουμε 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 χρωματισμούς σε κονσόλα, που είχα φτιάξει παλαιότερα)...
Γίνεται και με συναρτήσεις, αλλά θέλει (αρκετή έως πολύ) περισσότερη δουλειά.
ΥΓ. Πόσταρα και screen-shots από 4 skins στο νήμα του HexView
Στη συνάρτηση που φτιάχνει το μαύρο 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