Usuń funkcję podczas kompilacji, definiując go jako pusty makro

głosy
5

W tym przykładzie kodu makra albo jest zdefiniowana lub wykomentowane przez programistę w celu usunięcia funkcji z uwolnionym oprogramowania.

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

Czy jest coś złego w tym?

Utwórz 06/05/2017 o 20:07
użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

To będzie działać. Ale cały symbol jest usuwany w ten sposób. Wolę następującą 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;
}

Dodaje się zmieniło:

  • #ifTeraz porównuje wartość logiczną. IDE jest teraz w stanie dowiedzieć się, gdzie MACROjest zdefiniowana, we wszystkich przypadkach. (prawy przycisk myszy, znaleźć definicja)
  • Można, zmieniając MACRO2, zmienić cały sens Function. Na przykład, wariant uwolnienie skompilowany może zawierać Drukuj do pliku lub dziennika systemu.
  • Zawsze będzie symbolem Function, nawet jeśli nic nie robi, nawet w skompilowanego kodu. Ma to tę zaletę, że literały ciągów znaków w argumencie nadal liczyć statystyk wielkości. Jako osadzonego dewelopera, uważam to ważne.

Oczywiście, jest to częściowo preferencje kto rzemiosło kod.

Odpowiedział 06/05/2017 o 20:20
źródło użytkownik

głosy
0

Nawet jeśli rozwiązanie działa, wolę następujące podejście:

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

Uwaga : Funkcja ta jest makro, funkcja jest rzeczywista nazwa funkcji

Działa to poprzez zdefiniowanie funkcji makro (A) do wywołania funkcji (const char *) gdy MAKRO jest włączony. Z drugiej strony, gdy makro jest wyłączony, wzywa do FUNKCJA (a) zostaną określone na niczym.

I preferują tę metodę, ponieważ byłoby łatwiej streszczenie dala makro używane do definiowania połączenia z makro definiowania definicji funkcji. Można mieć przypadki, w których w trybie zwolnienia wystarczy tylko usunąć niektóre z połączeń do funkcji. W takim przypadku wymagane jest jeszcze definicja function (). Na przykład:

#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;
}
Odpowiedział 06/05/2017 o 22:29
źródło użytkownik

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