Retirer une fonction lors de la compilation en la définissant comme une macro vide

voix
5

Dans ce code exemple une macro est soit définie ou commentée par le programmeur afin de supprimer une fonction du logiciel actuel.

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

Y at-il quelque chose de mal avec cela?

Créé 06/05/2017 à 20:07
utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Ça va marcher. Mais tout le symbole est retiré de cette manière. Je préfère la méthode suivante.

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

Ce qui suit a changé:

  • Le #ifcompare maintenant un booléen. Votre IDE est maintenant en mesure de trouver où MACROest définie, dans tous les cas. (clic droit, trouver définition)
  • Vous pouvez, en changeant MACROà 2, changer toute la signification de Function. Par exemple, une version compilée variante peut contenir une impression vers un fichier ou un journal du système.
  • Il y aura toujours un symbole pour Function, même si elle ne fait rien, même dans le code compilé. Ceci a l'avantage que la chaîne littéraux dans l'argument comptent encore les statistiques de taille. En tant que développeur intégré, je trouve cet important.

De toute évidence, cela est en partie la préférence de celui qui l'artisanat du code.

Créé 06/05/2017 à 20:20
source utilisateur

voix
0

Même si fonctionne votre solution, je préfère l'approche suivante:

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

Remarque : La fonction est la macro, la fonction est le nom réel de la fonction

Cela fonctionne en définissant la fonction macro (a) à un appel à la fonction (const char *) lorsque MACRO est activé. D'autre part, lorsque MACRO est désactivé, les appels à la fonction (a) sera définie à rien.

J'ai tendance à préférer cette méthode, car il serait plus facile à abstraire la macro utilisée pour définir l'appel de la macro définition de votre définition de la fonction. Vous pourriez avoir des cas où, en mode de déclenchement, vous ne devez supprimer certains des appels à la fonction. Dans ce cas, la définition de la fonction () est toujours nécessaire. Par exemple:

#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;
}
Créé 06/05/2017 à 22:29
source utilisateur

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