Fjerne en funksjon under kompilering ved å definere det som en tom makro

stemmer
5

I dette eksempelet kode en makro er enten bestemt eller kommen ut av programmerer for å fjerne en funksjon fra den frigjorte programvare.

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

Er det noe galt med dette?

Publisert på 06/05/2017 klokken 20:07
bruker
På andre språk...                            


2 svar

stemmer
0

Det vil fungere. Men hele symbol fjernes på denne måten. Jeg foretrekker følgende metode.

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

Følgende er endret:

  • Den #ifnå sammen en boolsk. IDE er nå i stand til å finne ut hvor MACROer definert, i alle tilfeller. (høyreklikk, finne definisjon)
  • Du kan, ved å endre MACROtil to, endre hele betydningen av Function. For eksempel kan en frigjørings kompilert variant inneholder en trykk til fil eller systemloggen.
  • Det vil alltid være et symbol for Function, selv om det gjør ingenting, selv i kompilert kode. Dette har den fordelen at de strenger i argument fortsatt telle til størrelse statistikk. Som en innebygd utvikler, jeg synes dette er viktig.

Dette er selvsagt delvis preferanse for den som håndverk koden.

Svarte 06/05/2017 kl. 20:20
kilden bruker

stemmer
0

Selv om løsningen fungerer, foretrekker jeg følgende tilnærming:

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

Merk : Funksjonen er makro, er Funksjon selve navnet på funksjonen

Dette fungerer ved å definere makrofunksjonen (a) til et kall til funksjon (const char *) når MACRO er aktivert. På den annen side, når MACRO er deaktivert, samtaler til FUNKSJON (a) vil bli definert til ingenting.

Jeg har en tendens til å foretrekke denne metoden siden det ville være lettere å abstrahere bort makroen brukes til å definere din oppfordring fra makro definere funksjonsdefinisjonen. Du har kanskje tilfeller hvor i utløserfunksjon du trenger bare å fjerne noen av samtalene for å fungere. I dette tilfelle er fortsatt nødvendig definisjonen av funksjonen (). For eksempel:

#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;
}
Svarte 06/05/2017 kl. 22:29
kilden bruker

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