Προς το περιεχόμενο

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • 0
ntenis

#define

Ερώτηση

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

8 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

Ο προεπεξεργαστής κάνει απλώς την αντικατάσταση at compile time για αυτό είναι "γρήγορος" ο κώδικας που προκύπτει.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Έχω την εντύπωση πως μπορείς να χρησιμοποιήσεις 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) γίνονται πολύ γρηγορότερα.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Ο compiler θα κάνει constant propagation και πιθανώς να μην υπάρχει καν σε κάποιο καταχωρήτη - εκτός από την έκδοση που θα την κάνει compile με debug flags.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

>
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;
}


 

Δεν το εχω δοκιμάσει, οπότε παίζει και εγώ να γράφω αρλούμπες. :D

 

EDIT: To έτρεξα και είναι μια χαρά, δοκίμασε να "παίξεις" με την αρχικοποίηση του flag, προκειμένου να δεις οτι όντως η #undef και μετά ξανά η #define επηρεάζει την τιμή.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Εκτός της αντικατάστασης ενός αλφαριθμητικού από έναν ακέραιο αριθμό, ο 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 σε μία νέα τιμή)...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

@parsifal: καλύτερα #define DISCRIM(a, b, c) ((B) * (B) - 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: καλύτερα #define DISCRIM(a, b, c) ((B) * (B) - 4 * (a) * ©). Και επιπλέον συνήθως οι σταθερές είναι καλό να δηλώνονται στα const data_type name = .... (βολεύει καλύτερα τους compilers).

 

Έχεις δίκιο, έπρεπε να το γράψω. Τα a, b, c θα μπορούσαν κάλλιστα να είναι σύνθετες παραστάσεις και να γίνει χαμός με τους προσεταιρισμούς. Καλό που διευκρινίστηκε.

 

Για σταθερές, κι εγώ χρησιμοποιώ constants αντί για define statements. Από το 1ο έτος της σχολής, μετά από μία τραυματική debugging εμπειρία! Με τις βελτιστοποιήσεις πολλών compilers, δεν ξέρω μάλιστα αν έχει καν νόημα να δηλωθούν και σε καταχωρητές. Ίσως γνωρίζεις περισσότερα, να μας διαφωτίσεις...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

@parsifal

 

Αυτά δε τα ήξερα! τώρα καταλαβαίνω γιατί λενε πως πράξεις στο προεπεξεργαστή γίνονται πολύ γρηγορότερα!

 

Για τη main δε το είχα φανταστεί καν οτι θα μπορούσε να σχετισθεί κάπως με τη λειτουργία του προεπεξεργαστή, νόμιζα πως αυτός ήταν σε άλλο επίπεδο, άσχετο πχ low level κώδικας, όταν γίνεται κατι πολύ σημαντικό και βασικό σε ενα λειτουργικό.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...