Eliminați o funcție în timpul compilării definind-o ca un macro gol

voturi
5

În acest exemplu de cod un macro este fie definită sau comentate de programator pentru a elimina o funcție din software-ul eliberat.

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

Este ceva în neregulă cu asta?

Întrebat 06/05/2017 la 20:07
de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

O sa mearga. Dar întregul simbol este eliminat în acest fel. Prefer următoarea metodă.

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

Următoarele sa schimbat:

  • #ifCompară acum un boolean. IDE - ul este acum capabil de a găsi în cazul în care MACROeste definit, în toate cazurile. (click dreapta, găsiți definiție)
  • Puteți, prin schimbarea MACROla 2, schimba intregul sensul Function. De exemplu, o variantă de eliberare compilat ar putea conține un fișier de imprimare pentru a sau jurnalul de sistem.
  • Nu va fi întotdeauna un simbol pentru Function, chiar dacă nu face nimic, chiar și în codul compilat. Acest lucru are avantajul că literali șir în argumentul încă conta la statisticile de mărime. În calitate de dezvoltator încorporat, mi se pare important acest lucru.

Evident, acest lucru este parțial preferința celui care meserii cod.

Publicat 06/05/2017 la 20:20
sursa de către utilizator

voturi
0

Chiar dacă soluția funcționează, prefer următoarea abordare:

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

Notă : funcția este macro, funcția este numele real al funcției

Aceasta funcționează prin definirea funcție macro (a) un apel la funcții (char const *), atunci când MACRO este activat. Pe de altă parte, atunci când MACRO este dezactivată, apelurile către FUNCTION (a) va fi definit la nimic.

Am tendința de a prefera aceasta metoda, deoarece ar fi mai ușor să abstractiza macro folosit pentru a defini apelul de macro definirea definiției funcției. S-ar putea avea cazuri în care în modul de eliberare ai nevoie doar pentru a elimina unele dintre apeluri de funcții. În acest caz, este încă necesară definirea function (). De exemplu:

#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;
}
Publicat 06/05/2017 la 22:29
sursa de către utilizator

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