Verwijdert een rol spelen tijdens het compileren van definiëren als lege macro

stemmen
5

In dit voorbeeld code een macro wordt ofwel gedefinieerd en besproken door de programmeur om een ​​functie uit de vrijgegeven software te verwijderen.

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

Is er iets mis met deze?

De vraag is gesteld op 06/05/2017 om 20:07
user
In andere talen...                            


2 antwoorden

stemmen
0

Het zal werken. Maar het hele symbool wordt verwijderd op deze manier. Ik hou van volgende 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;
}

Het volgende is veranderd:

  • Het #ifvergelijkt nu een logische. Uw IDE is nu in staat om uit te vinden, waar MACROis gedefinieerd, in alle gevallen. (rechts klikken, vinden definition)
  • U kunt, door het veranderen van MACRO2, wijzigt u de gehele betekenis van Function. Het is bijvoorbeeld mogelijk een versie gecompileerd variant een afdruk naar een bestand of systeem log bevatten.
  • Er zal altijd een symbool voor zijn Function, zelfs als het doet niets, zelfs in gecompileerde code. Dit heeft het voordeel dat de letterlijke tekenreeksen in het argument nog steeds rekenen op de grootte statistieken. Als een ingesloten ontwikkelaar, vind ik dit belangrijk.

Uiteraard is dit deels de voorkeur van degene die de code ambachten.

antwoordde op 06/05/2017 om 20:20
bron van user

stemmen
0

Ook al is uw oplossing werkt, ik heb liever de volgende aanpak:

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

Opmerking : functie wordt de macro-functie is de werkelijke naam van de functie

Dit werkt door het definiëren van de macrofunctie (a) om een ​​gesprek te Function (const char *) wanneer MACRO is ingeschakeld. Aan de andere kant, wanneer MACRO is uitgeschakeld, roept FUNCTIE (a) zal worden bepaald op niets uit.

Ik ben geneigd om deze methode de voorkeur, omdat het makkelijker om abstraheren de macro gebruikt om uw oproep van de macro definiëren van uw definitie van de functie te definiëren zou zijn. Je zou de gevallen waarin in versie modus hoeft u alleen maar te verwijderen een aantal van de oproepen naar functie. In dat geval is de definitie van functie () is nog steeds vereist. Bijvoorbeeld:

#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;
}
antwoordde op 06/05/2017 om 22:29
bron van user

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