Rimuovere una funzione durante la compilazione definendo come un macro vuoto

voti
5

In questo codice di esempio una macro può essere definito sia o commentata dal programmatore per rimuovere una funzione del software rilasciato.

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

c'è qualcosa di sbagliato con questo?

È pubblicato 06/05/2017 alle 20:07
dall'utente
In altre lingue...                            


2 risposte

voti
0

Funzionerà. Ma l'intero simbolo è stato rimosso in questo modo. Io preferisco il metodo seguente.

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

Quanto segue è cambiato:

  • L' #ifora confronta un valore booleano. Il vostro IDE è ora in grado di trovare dove MACROè definito, in tutti i casi. (tasto destro del mouse, trovare la definizione)
  • È possibile, modificando MACROa 2, cambiare l'intero significato di Function. Ad esempio, una variante di rilascio compilato potrebbe contenere una stampa su file o registro di sistema.
  • Ci sarà sempre un simbolo per Function, anche se non fa nulla, anche in codice compilato. Questo ha il vantaggio che i letterali stringa nell'argomento contano ancora le statistiche dimensioni. Come uno sviluppatore embedded, ho trovato questo importante.

Ovviamente, questo è in parte la preferenza di chi mestieri del codice.

Risposto il 06/05/2017 a 20:20
fonte dall'utente

voti
0

Anche se la soluzione funziona, preferisco l'approccio seguente:

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

Nota : la funzione è la macro, la funzione è il nome effettivo della funzione

Questo funziona definendo la funzione macro (a) per una chiamata a funzione (const char *) quando MACRO è abilitato. D'altra parte, quando MACRO è disattivata, le chiamate verso FUNZIONE (a) saranno definiti a nulla.

Io tendo a preferire questo metodo in quanto sarebbe più facile astrarre la macro utilizzato per definire la chiamata dalla macro che definisce la tua definizione di funzione. Si potrebbe avere casi in cui in modalità di rilascio solamente necessario rimuovere alcune delle chiamate di funzionare. In questo caso è ancora necessaria la definizione di funzione (). Per esempio:

#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;
}
Risposto il 06/05/2017 a 22:29
fonte dall'utente

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