[C] Function-like macro

Pagina: 1
Acties:

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
Heey,

Ben bezig met een programma waarbij (in speciale gevallen) een functie niet hoeft te worden uitgevoerd, maar gewoon true kan geven.

Dit geval moet kunnen worden aangegeven met een pre-compile configuratie parameter.

Nou dacht ik dat ik dit zo kon implementeren
(.h file)
code:
1
2
3
4
5
6
7
#define PDUR_ZERO_COST_OPERATION true

#if PDUR_ZERO_COST_OPERATION
    #define PduR_Init(ConfigPtr) true
#else
    void PduR_Init(int ConfigPtr);
#endif


(.c file)
code:
1
2
3
4
5
6
#if !PDUR_ZERO_COST_OPERATION
void PduR_Init(int ConfigPtr)
{
    printf ("Test code....\n\r");
}
#endif


door het zetten van de parameter "PDUR_ZERO_COST_OPERATION " zou de functie wel/niet worden uitgevoerd.

Hij compileert wel, maar de functie word gewoon altijd uitgevoerd als ik deze aanroep met bijv:
code:
1
PduR_Init(5);


Wat doe ik fout?
hoe moet het wel?

Klus page: http://klusthuis.blogspot.com


  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 01-12 06:36

Tux

Je wil in speciale gevallen true als return value... maar het returntype van de functie is void. Dus dan lijkt mij het een beetje overbodig om met een macro soms de functie te vervangen door 'true'.

Dan is het misschien handiger om:

C:
1
2
3
4
5
void PduR_Init(int ConfigPtr) {
    if (!PDUR_ZERO_COST_OPERATION) {
        //je code hier
    }
}


te doen.

[ Voor 30% gewijzigd door Tux op 06-03-2007 10:28 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
@Tux: gelijk heb je, maar ik ben vergeten te vertellen dat ik me aan deze specs moet houden:
Service for PduR initialization. If the configuration parameter PDUR_ZERO_COST_OPERATION is enabled this service shall be realized as an empty function-like macro. Otherwise the Initialization function shall initialize the PduR.

[ Voor 19% gewijzigd door liquid_ice op 06-03-2007 10:42 ]

Klus page: http://klusthuis.blogspot.com


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

De preprocessor kent geen true en false. Je zult met getallen (1 en 0) moeten werken :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Hackykid
  • Registratie: November 2003
  • Laatst online: 28-07-2024
Of natuurlijk met #ifdef/#ifndef, wat volgens mij de beste aanpak is aangezien 'PDUR_ZERO_COST_OPERATION is enabled' helemaal niks zegt over de waarde van de macro.

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

En ook niets over het 'bestaan' van de macro. Het nadeel van #ifndef (of !defined()) is dat dat ook wordt uitgevoerd als je PDUR_ZERO_COST_OPERATION op 0 zou zetten, terwijl #if !BLA wel goed gaat als BLA niet gezet is (wordt dan geinterpreteerd als 0).

Wij gebruiken in onze projecten altijd een 1 als iets enabled is, en niet gedefinieerd als iets disabled is. Dan kun je zowel de waarde zelf als defined() gebruiken en dus ook niet per ongeluk een fout maken (en daar we compileren voor win32, xbox, xbox 360, PS2, PS3 en GC hebben we ook véél van dat soort macro's ;))

[ Voor 3% gewijzigd door .oisyn op 06-03-2007 12:00 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
@oisyn: Het LIJKT alsof je jezelf tegenspreekt (of ik begrijp je niet volledig).

Eerst typ je dat #ifndef fout zou gaan ookal zet je iets op 0, en dan gaat #if wel goed.

Later typ je dat jullie zelf 1 en niet gedefined gebruiken zodat je geen fouten kan maken.

Klus page: http://klusthuis.blogspot.com


  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
Ik heb net nu werkend met de #if en met de #ifdef.

Moet alleen nog eens contact opnemen om uit te zoeken wat ze bedoelen met de specificaties.
Ik zag verderop in de specificaties staan dat ON enabled was en OFF disabled.
dus ik denk dat ik voor de #if ga.

Mijn code die ik nu heb (Voor als iemand ooit dit tegenkomt met hetzelfde probleem)
.h file
code:
1
2
3
4
5
6
7
#define PDUR_ZERO_COST_OPERATION 1

#if PDUR_ZERO_COST_OPERATION
    #define PduR_Init(test) 1
#else
    void PduR_Init(int test);
#endif


.c file
code:
1
2
3
4
5
#if !PDUR_ZERO_COST_OPERATION
void PduR_Init(int test)            // Pointer to post build configuration
{
    printf("Test...\n\r");
}


aanroep
code:
1
PduR_Init(5);

Klus page: http://klusthuis.blogspot.com


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

liquid_ice schreef op dinsdag 06 maart 2007 @ 12:31:
@oisyn: Het LIJKT alsof je jezelf tegenspreekt (of ik begrijp je niet volledig).

Eerst typ je dat #ifndef fout zou gaan ookal zet je iets op 0, en dan gaat #if wel goed.
Klopt
Later typ je dat jullie zelf 1 en niet gedefined gebruiken zodat je geen fouten kan maken.
Klopt ook. De fout die je dus kunt maken is dus dat je #ifndef gebruikt terwijl iets op 0 staat. Als je 1 en niet gedefinieerd gebruikt, dan maakt het niet uit of je #if! of #ifndef gebruikt, het gaat altijd goed :)

Het voorveel van een #if is trouwens dat je het makkelijker kunt combineren:
C:
1
2
3
#if AAP || NOOT && !MIES
    /* ... */
#endif


Als je wel/niet gedefinieerd gebruikt moet je overal defined() omheen zetten.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op dinsdag 06 maart 2007 @ 12:51:
Het voorveel van een #if is trouwens dat je het makkelijker kunt combineren:
C:
1
2
3
#if AAP || NOOT && !MIES
    /* ... */
#endif
Geen handig voorbeeld...
Is 't nou (AAP || NOOT) && !MIES, of AAP || (NOOT && !MIES), en gooit die ! (=not) misschien ook nog roet in 't eten? Jij weet vast wel wat de bedoeling is, maar weet je collega dat ook? Of een junior die 3 jaar na dato die source moet onderhouden?

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anders reageer je op het punt dat ik probeerde te maken ;). Wat bedoel je met die not trouwens? Dat werkt ook als MIES niet is gedefinieerd. Bovendien, als mijn collega wil weten waarom dat is dan kan hij dat zien aan de namen van de defines of de comments die erbij staan, en daar dus ook uit afleiden dat ik AAP || (NOOT && !MIES) bedoel.

[ Voor 83% gewijzigd door .oisyn op 06-03-2007 14:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Leuk dat je daar 2 edits voor nodig had. ;)
Als je die haakjes al meteen goed had gezet, had je collega en die junior die comments niet eens nodig gehad...

Edit van mijn kant: In mijn idioom (Pascal/Delphi) staat 'not' voor alles dat niet True is, dus ook null/nil/undefined.

[ Voor 28% gewijzigd door Verwijderd op 06-03-2007 14:33 ]


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 06 maart 2007 @ 14:24:
Leuk dat je daar 2 edits voor nodig had. ;)
Ik heb ook nog andere dingen te doen hier ;)
Als je die haakjes al meteen goed had gezet, had je collega en die junior die comments niet eens nodig gehad...
Die comments staan er voor waarom m'n code conditional is, niet hoe dat zo is (dat kunnen ze ook wel aan de code aflezen). En het gaat mijn collega's om het waarom en dus niet om het hoe. Als het niet goed blijkt te werken dan komt dat wel weer terug bij mij, dat hoeven zij niet te fixen. Daarnaast is operator precedence best belangrijk, leer je op de basisschool ook als je gaat rekenen.
Edit van mijn kant: In mijn idioom (Pascal/Delphi) staat 'not' voor alles dat niet True is, dus ook null/nil/undefined.
Naast het feit dat dit idioom niet geheel klopt (als je 'ongedefiniëerd' complementeert, dan is het nog steeds ongedefiniëerd), werkt de C preprocessor ook zo :). Dus als MIES niet is gedefinieerd, dan is
!MIES gelijk aan true. Dat is nou juist ook het hele idee. Je definieert iets op 1 als je het wilt enablen, je definieert het niet als je iets wilt disablen, zodat je altijd zowel #if als #ifdef kunt gebruiken.

[ Voor 13% gewijzigd door .oisyn op 06-03-2007 14:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
liquid_ice schreef op dinsdag 06 maart 2007 @ 10:38:
@Tux: gelijk heb je, maar ik ben vergeten te vertellen dat ik me aan deze specs moet houden:
Service for PduR initialization. If the configuration parameter PDUR_ZERO_COST_OPERATION is enabled this service shall be realized as an empty function-like macro. Otherwise the Initialization function shall initialize the PduR.
Meld de auteur even dat hij specs moet schrijven en geen C. Verder gewoon negeren.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1