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

Απορεία για τα #define


nilosgr

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

Γειά σας παιδιά,

έχω μια κουβέντα μ ένα φίλο μου και θέλω τη γνώμη σας. Συγκεκριμένα, βλέπουμε οτι ο πηγαίος κώδικας του Linux έχει άπειρες συναρτήσεις οι οποίες είναι υλοποιημένες με #define, για ποιό λόγο γίνεται αυτό; Είναι επειδή μια συνάρτηση γραμμένη με #define είναι πιό γρήγορη απ την ίδια αλλά γραμμένη "κανονικά" ή επειδη έτσι γράφτηκαν κι έτσι έμειναν;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Άν εννοείς για ποιό λόγο δέν γράφονται σαν κανονικές functions και ορίζονται inline η απλοϊκή απάντηση είναι ότι υπό προϋποθέσεις οι inline είναι γρηγορότερες και μειώνουν το μέγεθος του παραγόμενου binary ΑΝ χρησιμοποιηθούν σωστά και με φειδώ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

Τα #defines και γενικότερα τα macros δεν είναι συναρτήσεις, και δεν υπάρχουν στο τελικό εκτελέσιμο ως συναρτήσεις. Μπορείς να το δείς και με την εντολή $nm <executable name>. Στην ουσία τα macros δεν μεταγλωττίζονται ποτέ απο τον μεταγλωττιστή, γιατί απλούστατα τα επεξεργάζεται πρίν από τον μεταγλωττιστή ο προεπεξεργαστής (C preprocessor). Ο οποίος στην ουσία αυτό που κάνει είναι να αντικαθιστά/αλλάζει τον κώδικα που έχει οριστεί στο macro, στα σημεία που αναφέρεται. Το αποτέλεσμα είναι ο πηγαίος κώδικας που μεταγλωττίζεται είναι λίγο διαφορετικός απο αυτόν που υπάρχει στο αρχείο. Π.χ.:

 

αν έχουμε τον κώδικα

>
#include <stdio.h>
#define PI 3.14159

int main(void) {
   printf("PI=%f\n", PI);
}

στην ουσία ο παρακάτω κώδικας θα μεταγλωττιστεί:

>
#include <stdio.h>

int main(void) {
   printf("PI=%f\n", 3.14159);
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

  • Δημιουργία νέου...