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

Απορεία για τα #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);
}

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

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

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