Odstranit funkci během kompilace tím, že definuje jako prázdné makro

hlasů
5

V tomto příkladu kódu je makro buď definovaná nebo zakomentován programátorem s cílem odstranit funkci ze uvolněného softwaru.

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

Je na tom něco špatného?

Položena 06/05/2017 v 20:07
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Bude to fungovat. Ale celá symbol odstraněn tímto způsobem. Dávám přednost následujícím způsobem.

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

Vkládá se změnila:

  • #ifNyní porovnává boolean. Vaše IDE je nyní schopen zjistit, kde MACROje definováno, ve všech případech. (klikněte pravým tlačítkem myši, najít definici)
  • Můžete změnou MACROna 2, změnit celý smysl Function. Například varianta uvolnění sestavil může obsahovat Tisk do souboru nebo systémového protokolu.
  • Vždy budou existovat symbolem Function, i když to nemá nic společného, a to i v zkompilovaný kód. To má tu výhodu, že řetězcové literály v argumentu stále počítat do statistik velikosti. Jako vložený vývojář, to považuji za důležité.

Je zřejmé, že je to částečně preference toho, kdo řemeslná kód.

Odpovězeno 06/05/2017 v 20:20
zdroj uživatelem

hlasů
0

I přesto, že vaše řešení funguje, dávám přednost následující postup:

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

Poznámka : Funkce je makro, funkce je skutečný název funkce

To funguje tak, že definuje funkce makro (a) pro volání funkce (const char *), pokud je povoleno MACRO. Na druhou stranu, když MACRO je zakázán, volání FUNCTION (a) bude definována tak, aby nic.

I upřednostňují tuto metodu, protože by to bylo jednodušší abstraktní pryč makro slouží k definování váš hovor z makra definující svou definici funkce. Ty by mohly mít případy, kdy v režimu vydání Jediné, co potřebujete, aby se odstranily některé volání funkce. V tomto případě je stále zapotřebí definice funkce (). Například:

#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;
}
Odpovězeno 06/05/2017 v 22:29
zdroj uživatelem

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