ntenis Δημοσ. 7 Νοεμβρίου 2007 Δημοσ. 7 Νοεμβρίου 2007 geia sas.. mipos kserei na mou pei kapoios pos mporo na valo sto define kapoies sta8eres,etsi oste mesa sto programa na sugkrino me to define... px mporo na kano.... #define tags (<div>,<par>,<it>) int main( void ) { #ifdef tags printf( "to tag uparxei.." ); #endif } thx
Lomar Δημοσ. 7 Νοεμβρίου 2007 Δημοσ. 7 Νοεμβρίου 2007 > int main( void ) { #ifdef tags printf( "to tag uparxei.." ); #endif } Νομίζω αυτά, επειδή είναι εντολές στον προεπεξεργαστή της C, δεν λειτουργούν στη main, λειτουργούν (είμαι σίγουρος για αυτό) στον προεπεξεργαστή όμως (η περιοχή πριν απο την main). Επίσης δεν έχω ξαναδεί την #define να την δηλώνουν με τέτοια σύνταξη. Συνήθως είναι κάτι σαν: #define a 50 κτλ... Δοκίμασε κάτι σαν το παρακάτω: > #define tags /*ΕΔΩ ΒΑΛΕ ΜΙΑ ΤΙΜΗ, ΠΧ 5: #define tag 5*/ #define temp 0 /*ΑΡΧΙΚΟΠΟΙΟΥΜΕ ΜΙΑ ΜΕΤΑΒΛΗΤΗ ΓΙΑ ΝΑ ΤΗΝ ΧΡΗΣΙΜΟΠΟΙΗΣΟΥΜΕ ΣΑΝ flag */ #ifdef tags /* ΑΝ ΥΠΑΡΧΕΙ ΤΟ tag ΤΟΤΕ Η temp ΝΑ ΓΙΝΕΙ 1, ΑΛΛΙΩΣ ΠΑΡΑΜΕΝΕΙ 0 */ #undef temp #define temp 1 #endif int main( void ) { if (temp==1) printf( "to tag uparxei.." ); else printf ("to tag den uparxei..."); system ("pause"); return 0; } Δεν το εχω δοκιμάσει, οπότε παίζει και εγώ να γράφω αρλούμπες. EDIT: To έτρεξα και είναι μια χαρά, δοκίμασε να "παίξεις" με την αρχικοποίηση του flag, προκειμένου να δεις οτι όντως η #undef και μετά ξανά η #define επηρεάζει την τιμή.
parsifal Δημοσ. 7 Νοεμβρίου 2007 Δημοσ. 7 Νοεμβρίου 2007 Εκτός της αντικατάστασης ενός αλφαριθμητικού από έναν ακέραιο αριθμό, ο preprocessor μπορεί να αντικαταστήσει αλφαριθμητικό και με: Έναν πραγματικό, π.χ.>#define PI 3.14 Ένα άλλο string, π.χ.>#define NICKNAME "denis" ψευδοσυναρτήσεις (macros), π.χ.>#define DISCRIM(a, b, c) (b * b - 4 * a * c) Τα υπόλοιπα που γράφει ο Lomar είναι σωστά, εκτός από 2 σημεία: Στο σχόλιο της 2ης γραμμής του κώδικα (με την define δε γίνεται καμμία δέσμευση μνήμης κατά τον χρόνο εκτέλεσης, επομένως δε μπορούμε να μιλάμε για μεταβλητή) και στον περιορισμό σε σχέση με τη main (μέσα στη main δε μπορείς να κάνεις define έναν νέο όρο. Μπορείς όμως να κάνεις undef έναν όρο που έχει γίνει define πριν την main και ακολούθως να τον ξανακάνεις define σε μία νέα τιμή)...
Lomar Δημοσ. 8 Νοεμβρίου 2007 Δημοσ. 8 Νοεμβρίου 2007 @parsifal Αυτά δε τα ήξερα! τώρα καταλαβαίνω γιατί λενε πως πράξεις στο προεπεξεργαστή γίνονται πολύ γρηγορότερα! Για τη main δε το είχα φανταστεί καν οτι θα μπορούσε να σχετισθεί κάπως με τη λειτουργία του προεπεξεργαστή, νόμιζα πως αυτός ήταν σε άλλο επίπεδο, άσχετο πχ low level κώδικας, όταν γίνεται κατι πολύ σημαντικό και βασικό σε ενα λειτουργικό.
dark_banishing Δημοσ. 8 Νοεμβρίου 2007 Δημοσ. 8 Νοεμβρίου 2007 Ο προεπεξεργαστής κάνει απλώς την αντικατάσταση at compile time για αυτό είναι "γρήγορος" ο κώδικας που προκύπτει.
pinball_elf Δημοσ. 8 Νοεμβρίου 2007 Δημοσ. 8 Νοεμβρίου 2007 Έχω την εντύπωση πως μπορείς να χρησιμοποιήσεις macros σε οποιοδήποτε σημείο ενόw προγράμματος, ακόμα και μέσα στην main, απλά θα μπορείς να το χρησιμοποιείς απο το σημείο που το δήλωσες και μέτα. > int main( void ) { #define tags (<div>,<par>,<it>) #ifdef tags printf( "to tag uparxei.." ); #endif } Ο pre-processor ανάλογα με τα directives που του δίνονται προσπαθεί να διαμορφώσει τον κώδικα του προγράμματος: π.χ. στο παρακάτω πρόγραμμα το κομμάτι ανάμεσα στα #ifdef .. #endif δεν γίνεται compile > int main( void ) { #ifdef tags printf( "to tag uparxei.." ); #endif } Για αυτό το λόγο πολλές φορές τα macros χρησιμοποιούνται για να έχεις κώδικα μέσα στο πρόγραμμα σου ο οποίος δεν γίνεται compiled, και κυρίως τον ενεργοποιοείς και τον χρησιμοποιείς για λόγους συντήρησης. Αυτά δε τα ήξερα! τώρα καταλαβαίνω γιατί λενε πως πράξεις στο προεπεξεργαστή γίνονται πολύ γρηγορότερα! Στον προεπεξεργαστή δεν γίνεται ακριβώς καμία πράξη, Αυτό που κάνει στην ουσία ο προεπεξεργαστής είναι να αντικαθιστά τον κωδικα του προγράμματος αvάλογα με τα directives (#define, #ifdef, #ifndef ...) πριν αυτος γίνει compile. Και φυσικά επειδή στην ουσία δεν πρόκειται για κάποιο function call, οι πράξεις (runtime) γίνονται πολύ γρηγορότερα.
dop Δημοσ. 9 Νοεμβρίου 2007 Δημοσ. 9 Νοεμβρίου 2007 @parsifal: καλύτερα #define DISCRIM(a, b, c) (( * ( - 4 * (a) * ©). Και επιπλέον συνήθως οι σταθερές είναι καλό να δηλώνονται στα const data_type name = .... (βολεύει καλύτερα τους compilers). Και ναι μπορείς να χρησιμοποιήσεις macros οπουδήποτε. Μάλιστα μπορείς να τα κάνεις και undefine. Πχ #define LALA #ifdef LALA // do something #endif #undef LALA #ifdef LALA // do something else #endif
parsifal Δημοσ. 9 Νοεμβρίου 2007 Δημοσ. 9 Νοεμβρίου 2007 @parsifal: καλύτερα #define DISCRIM(a, b, c) (( * ( - 4 * (a) * ©). Και επιπλέον συνήθως οι σταθερές είναι καλό να δηλώνονται στα const data_type name = .... (βολεύει καλύτερα τους compilers). Έχεις δίκιο, έπρεπε να το γράψω. Τα a, b, c θα μπορούσαν κάλλιστα να είναι σύνθετες παραστάσεις και να γίνει χαμός με τους προσεταιρισμούς. Καλό που διευκρινίστηκε. Για σταθερές, κι εγώ χρησιμοποιώ constants αντί για define statements. Από το 1ο έτος της σχολής, μετά από μία τραυματική debugging εμπειρία! Με τις βελτιστοποιήσεις πολλών compilers, δεν ξέρω μάλιστα αν έχει καν νόημα να δηλωθούν και σε καταχωρητές. Ίσως γνωρίζεις περισσότερα, να μας διαφωτίσεις...
dop Δημοσ. 18 Νοεμβρίου 2007 Δημοσ. 18 Νοεμβρίου 2007 Ο compiler θα κάνει constant propagation και πιθανώς να μην υπάρχει καν σε κάποιο καταχωρήτη - εκτός από την έκδοση που θα την κάνει compile με debug flags.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.