Entfernen Sie eine Funktion während der Kompilierung, indem sie es als leeres Makro definieren

stimmen
5

In diesem Beispielcode wird ein Makro entweder definiert oder durch den Programmierer, um eine Funktion aus der freigegebenen Software zu entfernen kommentiert werden.

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

Gibt es etwas falsch mit diesem?

Veröffentlicht am 06/05/2017 um 20:07
vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Es wird klappen. Aber das gesamte Symbol wird auf diese Weise entfernt. Ich ziehe es die folgende Methode.

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

Im Folgenden hat sich geändert:

  • Das #ifvergleicht nun einen boolean. Ihre IDE ist nun in der Lage zu finden , wo MACROdefiniert ist , in allen Fällen. (Rechtsklick, finden Definition)
  • Sie können, indem MACROauf 2, ändern Sie die gesamte Bedeutung Function. Zum Beispiel kann ein Release zusammengestellt Variante könnte einen Druck in Datei oder das Systemprotokoll enthalten.
  • Es wird immer ein Symbol für sein Function, auch wenn es nichts tut, auch in kompilierter Code. Dies hat den Vorteil , dass die Zeichenfolgenliterale in dem Argumente noch auf die Größe Statistiken zählen. Als Embedded - Entwickler, finde ich das wichtig.

Offensichtlich ist dies teilweise die Bevorzugung des einen, der den Code Handwerk.

Beantwortet am 06/05/2017 um 20:20
quelle vom benutzer

stimmen
0

Auch wenn Ihre Lösung funktioniert, ziehe ich folgende Vorgehensweise vor:

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

Hinweis : FUNKTIONS das Makro ist, Funktion ist der tatsächliche Name der Funktion

Dies funktioniert durch die Makro-Funktion zu definieren (a) zu einem Aufruf von Funktion (const char *), wenn MACRO aktiviert ist. Auf der anderen Seite, wenn MACRO deaktiviert ist, ruft Funktion (a) wird auf nichts festgelegt werden.

Ich neige dazu, diese Methode zu bevorzugen, da es das Makro leichter zu abstrahieren verwendet würde Ihren Anruf von der Makro-Definition Ihrer Funktionsdefinition zu definieren. Sie könnten Fälle, wo im Release-Modus nur einige der Anrufe entfernen müssen funktionieren. In diesem Fall ist die Definition der Funktion () ist nach wie vor erforderlich. Beispielsweise:

#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;
}
Beantwortet am 06/05/2017 um 22:29
quelle vom benutzer

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