Eliminar una función durante la compilación definiéndola como una macro vacía

votos
5

En este código de ejemplo una macro se define o comentada por el programador con el fin de eliminar una función de la software lanzado tampoco.

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

¿Hay algo malo con esto?

Publicado el 06/05/2017 a las 17:07
por usuario
En otros idiomas...                            


2 respuestas

votos
0

Funcionará. Pero el símbolo completo se elimina de esta manera. Yo prefiero el método siguiente.

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

Lo siguiente ha cambiado:

  • El #ifcompara ahora un booleano. El IDE es ahora capaz de encontrar donde MACROse define, en todos los casos. (clic derecho, encontrar la definición)
  • Puede, cambiando MACROa 2, cambiar todo el significado de Function. Por ejemplo, una variante liberación compilado puede contener algún tipo de impresión en un archivo o registro del sistema.
  • Siempre habrá un símbolo para Function, incluso si no hace nada, ni siquiera en el código compilado. Esto tiene la ventaja de que los literales de cadena en el argumento todavía cuentan con las estadísticas de tamaño. Como desarrollador incrustado, Me parece importante.

Obviamente, esto es en parte la preferencia de la persona que la artesanía del código.

Respondida el 06/05/2017 a las 17:20
fuente por usuario

votos
0

A pesar de que su solución funciona, prefiero el siguiente enfoque:

#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 función es la macro, la función es el nombre real de la función

Esto funciona mediante la definición de la función macro (a) a una llamada a la función (const char *) cuando se habilita MACRO. Por otro lado, cuando se desactiva MACRO, llama a una función (a) se definirá a nada.

Yo tiendo a preferir este método, ya que sería más fácil de abstraer la macro se utiliza para definir la llamada de la macro la definición de su definición de la función. Es posible que haya casos en los que en modo de lanzamiento sólo se necesita para eliminar algunas de las llamadas a función. En ese caso, sigue siendo necesaria la definición de la función (). Por ejemplo:

#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;
}
Respondida el 06/05/2017 a las 19:29
fuente por usuario

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