Makros mit unbekannter Anzahl an Parametern?



  • Hallo *,

    ich sitze grade an einem Projekt, welches viele Callback Funktionen für expat enthält. Die Signatur sieht dabei immer so aus

    void XMLCALL KlasseXY::xmlIrgendwast(void *userData, const char**atts)
    

    userDataist mit einer Datenstruktur belegt, um die gehts aber nicht.
    atts wird von expat wie folgt gefüllt:

    • atts[i] enthält den Namen des Parameters im XML Stream
    • atts[i+1] den zugehörigen Wert

    Jetzt möchte ich mit diesen Daten natürlich etwas anfangen und könnte meine lokalen Variablen einfach mit

    int i = atoi(atts[1]);
    char* x = atts[3];
    //usw.
    

    zuweisen. Der Pferdefuß an der ganzen XML Geschichte ist aber natürlich, dass Parameter in beliebiger Reihenfolge stehen können; daher werden die Namen ja auch mit übergeben.

    Nun habe ich mir folgendes Konstrukt geschrieben:

    int a; 
    	char* b = NULL;
    	int i;
    	for (i = 0; atts[i]!=NULL; i += 2) {
    		if(strcmp(atts[i],"Irgendwas")==0)
    			a = atoi(atts[i+1]);
    		else 
    		if(strcmp(atts[i],"Irgendwas Anderes")==0)
    			b = atts[i+1];
    		else std::cout << "Warning: unknown tag " << atts[i] << " = " << atts[i+1] << " encounterd at line " 
    << XML_GetCurrentLineNumber(*PointeraufXMLParser) << std::endl;
    	}
    

    Wenn ich das jetzt für mehr Parameter mache, müllt das den ganzen Code zu. Meine Idee war jetzt, mir ein Makro zu schreiben, dem ich immer Paare aus char* für den Namen und eine void Referenz für den Wert übergebe.
    Ich habe zwar schon mit Funktionen mit variablen Argumenten Listen gearbeitet, bin aber nicht so fit in Makros.

    Könnte mir jemand auf die Sprünge helfen, bitte? 😕



  • Ich glaube das gehört in`s C++ Forum, hier ist ANSI C! 😉



  • Oh sorry, mir war der Unterschied nie wirklich klar. Na ja, mag's ein Mod verschieben?



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • C++ was?! Da muss ich dich leider enttäuschen, da gibt es sowas nicht.

    Variable-argument preprocessor function macros
    
    C99 supports preprocessor function macros that may take a variable number of arguments. Such macros are defined with a trailing '...' token in their parameter lists, and may use the __VA_ARGS__ reserved identifier in their replacement text.
    
    For example:
    
        #define DEBUGF(f,...) \
            (fprintf(dbgf, "%s(): ", f), fprintf(dbgf, __VA_ARGS__))
    
        #define DEBUGL(...) \
            fprintf(dbgf, __VA_ARGS__)
    
        int incr(int *a)
        {
            DEBUGF("incr", "before: a=%d\n", *a);
            (*a)++;
            DEBUGL("after: a=%d\n", *a);
            return (*a);
        } 
    
    C++ does not provide this feature.
    
    (This feature is likely to be provided as an extension by many C++ compilers.)
    
    [C99: §6.10.3, 6.10.3.1, 6.10.3.4, 6.10.3.5]
    [C++98: §16.3, 16.3.1]
    

    Das steht hier...wie dort steht unterstützt das dein Compiler unter Umständen aber trotzdem. Du musst es halt ausprobieren.



  • Ah vielen Dank, das brachte mich schonmal weiter. VS 2005 scheint das Makro jedenfalls zu unterstützen.

    Aber wie immer stellt man hinterher fest, dass das gar nciht das ist, was man gesucht hatte; oder gibt es eine Möglichkeit die Argumente zu indizieren?
    Im obigen Beispiel brauche ich sie ja immer paarweise sowie den Typ - also Tripel.

    Wahrscheinlich denk ich wieder viel zu kompliziert 😞


Anmelden zum Antworten