Define af funk. med ukendt antal parametre, hvordan?
Jeg har skrevet et funktion, som tager et ukendt antal parametre. Prototypen er vist herunder:
void Test(char ch, ...)
Den første parameter er altså en char, og de efterfølgende er ukendte.
Spørgsmål: Hvordan laver jeg en define til en sådan funktion?
Løsningen skal ligne nedenstående: #ifdef DEBUG void Test2(char ch, char ch2) #define TEST2(a, b) Test2(a, b) #else #define TEST(a, b) #endif
Den opmærksomme ekspert har nok opdaget, at jeg er interesseret i at lave en funktion, som KUN er defineret i debug mode. Men hvordan laver man en sådan define til en funktion, som tager et ukendt antal parametre?
Hvis du i debug vil køre en anden funktion men med samme parametre, skal du lave en wrapper, dvs. i princippet bare overloade din Test funktion:
#ifdef DEBUG void Test(char a, char b) { Test2(a, b); }; #endif
Den originale Test funktion lægger du i en .cpp unit - debug versionen i en anden:
// orginale test cpp #ifndef DEBUG
: // Hele funktionen
#endif
// Debug test cpp #ifdef DEBUG
: // Hele funktionen
#endif
Hermed kan dit projekt se ens ud hver gang, og kun test modulets originale og debug cpp skal omkompileres for at du kører debug. (Husk at de fleste compilerer ikke automatisk laver ny MAKE, når du ændrer projektet faste declares.)
Det jeg vil opnå er, at funktionen KUN eksisterer i debug-mode. Altså: i release-mode eksisterer funktionen slet ikke - det er derfor jeg vil lave en #define af funktionen.
Følgende programudsnit illustrerer problemstillingen:
Ovenstående vil i debug-mode udskrive teksten: \"Debug mode - tallet er: 10\". I release-mode vil det IKKE blive udskrevet noget, da funktionen Dummy() IKKE bliver kaldt (den eksisterer jo ikke i release-mode).
Ovenstående eksempel virker perfekt. Problemet er bare: hvordan laver man en define af en funktion med et variabelt antal parametre? Jeg har ladet mig fortælle at det ikke kan lade sig gøre, men det har jeg ærlig talt lidt svært ved at tro på.
Jeg vil helst undgå at lave et funktionskald til en funktion som ikke laver noget. Jeg ved godt, at et ekstra funktionskald engang i mellem ikke er det der trækker tænder ud, men det virker alligevel sjusket. Desuden drejer det sig om ca. 10.000 ekstra funktionskald i mit tilfælde - og det vil jeg meget gerne undgå!
Jeg mener også du kan \"overloade\" #define, dvs. lave et antal (men ikke udbegrænset) varianter af din debug funktion:
#define DUMMY(a) Dummy(a) #define DUMMY(a, b) Dummy(a, b)
osv.
Din Dummy() funktion kan du stadig definere som
void Dummy(a, ...);
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.