Boş bir makro olarak tanımlayarak derleme sırasında bir işlev kaldırma

oy
5

Bu örnek kodda bir makro ya tanımlanır veya serbest yazılımdan bir işlev kaldırmak için programcı tarafından yorumladı.

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

Bu yanlış bir şey var mı?

Oluştur 06/05/2017 saat 20:07
kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Çalışacak. Ama bütün sembol bu şekilde kaldırılır. Aşağıdaki yöntemi tercih ediyorum.

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

Aşağıdaki değişti:

  • #ifŞu anda bir boolean karşılaştırır. Kişisel IDE şimdi nerede bulmak mümkün olduğu MACROher durumda, tanımlanır. (sağ tanım bulmak tıklayın)
  • Sen değiştirerek yapabilirsiniz MACRO2'ye, tüm anlamını değiştirebilir Function. Örneğin, bir serbest bırakma derlenmiş varyant dosya veya sistem günlük bir baskı içerebilir.
  • Her zaman için bir sembol olacak Functionhatta derlenmiş kod, hiçbir şey yapmaz bile,. Bu argüman dize hazır hala boyut istatistiklerine saymak yararı vardır. Gömülü bir geliştirici olarak, bu önemli buluyorum.

Açıkçası, bu kısmen kodu el sanatları birinin tercihidir.

Cevap 06/05/2017 saat 20:20
kaynak kullanıcı

oy
0

Çözümünüz çalışır halde ben şu yaklaşımı tercih:

#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 : FONKSİYON makro olduğunu Fonksiyon işlevinin fiili adıdır

Bu MAKRO etkindir Fonksiyonu bir çağrı (const char *) makro FUNCTION (a) tanımlayarak çalışır. Öte yandan, MAKRO devre dışı bırakıldığında, (a) hiçbir şey belirlenecektir İŞLEVİ çağırır.

Bunun senin işlevi tanımı tanımlayan makro çağrı tanımlamak için kullanılan makro uzakta soyut daha kolay olacağını beri bu yöntemi tercih etme eğilimindedir. Sürüm modunda yalnızca aramaların bazı İşlev çıkarmanız gerekir vakaları olabilir. Bu durumda Fonksiyon tanımı () hala gereklidir. Örneğin:

#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;
}
Cevap 06/05/2017 saat 22:29
kaynak kullanıcı

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