Αφαιρέστε μια λειτουργία κατά τη διάρκεια της μεταγλώττισης ορίζοντας ως ένα άδειο μακρο

ψήφοι
5

Σε αυτό το παράδειγμα κώδικα μακροεντολής είτε καθορίζονται είτε σε σχόλια από τον προγραμματιστή για να διαγράψετε μια λειτουργία από τη κυκλοφόρησε το λογισμικό.

#include <stdio.h>

#define MACRO //or omitted

#ifdef MACRO
    void Function(const char* str)
    {
        printf(%s\n, str);
    }

#else
    #define Function(str)

#endif

int main(void)
{
    Function(hello world);
    getchar();
    return 0;
}

Υπάρχει κάποιο πρόβλημα με αυτό;

Δημοσιεύθηκε 06/05/2017 στις 20:07
χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

Θα δουλέψει. Αλλά η όλη σύμβολο αφαιρείται με αυτόν τον τρόπο. Προτιμώ την εξής μέθοδο.

#include <stdio.h>

#define MACRO    1

#if MACRO
    void Function(const char* str)
    {
        printf("%s\n", str);
    }

#else
    void Function(const char *str){}

#endif

int main(void)
{
    Function("hello world");
    getchar();
    return 0;
}

Η ακόλουθη έχει αλλάξει:

  • Η #ifπλέον συγκρίνει μια boolean. IDE σας είναι πλέον σε θέση να βρείτε όπου MACROορίζεται, σε όλες τις περιπτώσεις. (δεξί κλικ, να βρείτε τον ορισμό)
  • Μπορείτε να, αλλάζοντας MACROσε 2, να αλλάξει ολόκληρο το νόημα της Function. Για παράδειγμα, μια παραλλαγή απελευθέρωση καταρτίζονται μπορεί να περιέχει μια εκτύπωση σε αρχείο ή αρχείο καταγραφής του συστήματος.
  • Πάντα θα υπάρχει ένα σύμβολο για την Function, έστω και αν δεν κάνει τίποτα, ακόμη και σε μεταγλωττισμένο κώδικα. Αυτό έχει το πλεονέκτημα ότι οι κατεξοχήν συμβολοσειρά στο επιχείρημα εξακολουθούν να μετράνε με τα στατιστικά στοιχεία του μεγέθους. Ως ένα ενσωματωμένο προγραμματιστή, θεωρώ αυτό σημαντικό.

Προφανώς, αυτό είναι εν μέρει η προτίμηση αυτού που βιοτεχνία τον κωδικό.

Απαντήθηκε 06/05/2017 στις 20:20
πηγή χρήστη

ψήφοι
0

Ακόμα κι αν η λύση σας λειτουργεί, προτιμώ την ακόλουθη προσέγγιση:

#include <stdio.h>

#define MACRO //or omitted

#ifdef MACRO
#define FUNCTION(a) Function(a);
#else
#define FUNCTION(a)
#endif

#ifdef MACRO
    void Function(const char* str)
    {
        printf("%s\n", str);
    }
#endif

int main(void)
{
    FUNCTION("hello world")
    getchar();
    return 0;
}

Σημείωση : Η λειτουργία είναι το macro, Λειτουργία είναι το πραγματικό όνομα της συνάρτησης

Αυτό λειτουργεί καθορίζοντας τη λειτουργία macro (α) σε μια κλήση σε λειτουργία (const char *), όταν είναι ενεργοποιημένη η MACRO. Από την άλλη πλευρά, όταν MACRO είναι άτομα με ειδικές ανάγκες, οι κλήσεις προς ΛΕΙΤΟΥΡΓΙΑ (α) θα καθοριστούν σε τίποτα.

Έχω την τάση να προτιμούν αυτή τη μέθοδο, δεδομένου ότι θα ήταν ευκολότερο να αφηρημένη μακριά η μακροεντολή χρησιμοποιείται για να καθορίσει την κλήση σας από το μακροοικονομικό καθορισμό ορισμό της συνάρτησης σας. Μπορεί να έχετε περιπτώσεις όπου σε λειτουργία απελευθέρωση το μόνο που χρειάζεται να αφαιρέσετε κάποιες από τις κλήσεις για να λειτουργήσει. Σε αυτή την περίπτωση εξακολουθεί να απαιτείται ο ορισμός των λειτουργιών (). Για παράδειγμα:

#include <stdio.h>

#define DEBUG //or omitted

#ifdef DEBUG
#define FUNCTION(a) Function(a);
#else
#define FUNCTION(a)
#endif

void Function(const char* str)
{
    printf("%s\n", str);
}

int main(void)
{
    // Call function with Hello World only in debug
    FUNCTION("hello world")
    getchar();

    // Call function with goodbye world in both debug and release
    Function("goodbye world");
    return 0;
}
Απαντήθηκε 06/05/2017 στις 22:29
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more