2010-12-02 10 views
0

Derzeit nenne ich Funktion auf diese Weise:Kann ich Funktionen als Parameter übergeben und die Funktion kann verschiedene Argumente enthalten?

typedef struct OptionValueStruct{ 
    const char *option_name;  
    int (*func)(char*, char**);  
} OptionValueStruct_t; 


int parse2parameter(char *opt_name, char** opt_val); 
int parse3parameter(char *opt_name, char** opt_val, int a); 


const OptionValueStruct_t option_values[] = { 
{"Counter1", parse2parameter} 
}; 

wo parse2parameter eine func() mit 2 Parameter, die in OptionValueStruct_t definiert ist.
Wie ist es möglich, dass ich

const OptionValueStruct_t option_values[] = { 
{"Counter1", parse2parameter}, 
{"Counter2", parse3parameter} 
}; 

Wo parse2parameter() und parse3parameter() unterschiedliche Anzahl/Art des Parameters?

+0

Setzen Sie das alles in eine Codebox. Sie können dies tun, indem Sie den gesamten Code auswählen (entfernen Sie zuerst das "' ") und klicken Sie auf die Schaltfläche 101010 im Rich-Text-Editor. Alternativ können Sie einen Abstand zwischen dem Code und anderem Text hinzufügen und den Code mit 4 Leerzeichen einrücken. –

Antwort

2

Was versuchen Sie wirklich und warum?

Denken Sie an den Code, wo Sie den Funktionszeiger erhalten. Wie werden Sie wissen, wie man es nennt?

+0

weil verschiedene Zähler unterschiedliche Funktionen erfordern. Thx – user389955

+0

Ich glaube nicht, dass Sie verstehen, was ich gefragt habe. "Wie" wird nicht mit "weil" beantwortet. –

+0

In meiner Antwort gibt es eine Antwort darauf, wie man es anruft (fügen Sie der Struktur einige Werte hinzu, die den Funktionstyp anzeigen). –

0

Betrachten Sie va_start, va_arg, va_end. Sie werden nicht durch zwei und drei Argumente eingeschränkt.

+0

scheint dies gilt, wenn wir mehrere Funktionen mit dem gleichen Namen, aber unterschiedliche Anzahl/Art von Parametern haben. aber mein Name ist auch anders. Wenn ich also va_start verwende, muss ich eine Funktion erstellen, die parse2parameter() und parse3parameter – user389955

+0

@ user389955 umschließt: Sie wird angewendet, wenn Sie eine "printf" -ähnliche Funktion haben. Es kann eine beliebige Anzahl von Variablen ausgeben, die Sie übergeben, weil es diese 'va_arg',' va_start' und 'va_end' verwendet. Der erste Parameter ist eine Zeichenkettenkonstante, die 'printf' analysiert, um zu erfahren, wie viele Folgen und deren Typen folgen, und sie auszudrucken. Die ersten beiden Parameter in Ihren Funktionen scheinen denselben Typ zu haben. Wenn Sie also eine String-Konstante als dritten Parameter hinzufügen und analysieren, können Sie alle Arbeiten mit nur einer Funktion ausführen. Wenn Sie Gründe haben, dies nicht zu verwenden, ist es am hilfreichsten, den Code anzuzeigen. – vpit3833

0

Sie können einfach int(*)() verwenden und einige andere Parameter haben, die die Funktionssignatur beschreiben, so dass Sie sie aufrufen können. Zum Beispiel:

typedef struct OptionValueStruct{ 
    const char *option_name; 
    int (*func)(); /* actually takes some arguments */ 
    unsigned num_args; /* might need more fields to describe the args */ 
} OptionValueStruct_t; 

...

switch (value.num_args){ 
case 2: ((int (*)(char*, char**))value.func)(opt_name, opt_val); 
case 3: ((int (*)(char*, char**, int))value.func)(opt_name, opt_val, a); 
} 

Eine andere Möglichkeit, nur den Zeiger zu deklarieren func würde parse3parameter, passen und dann nennen es immer, als ob es drei Argumente hat, und (auf einigen Plattformen) wird das dritte Argument einfach ignoriert. Dies ist jedoch wahrscheinlich nicht portierbar.

+0

Nein. Sie können einen Funktionszeiger nicht in ein 'void *' konvertieren, da 'sizeof (Funktionszeiger) <= sizeof (void *) 'nicht garantiert ist. –

+0

Können Sie eine Plattform benennen, bei der diese Nichtgarantie nicht funktioniert? Wie dem auch sei, wenn Sie sehr präzise über das Ganze sein wollen, können Sie den Typ einfach als Zeiger-zu-Lücke-Funktion schreiben und damit fertig sein, da ein Zeiger auf eine Funktion in C die gleiche Größe wie a hat Zeiger auf eine andere Funktion. Ich werde meine Antwort aktualisieren, um das zu tun. –

+0

ok. Danke, ich werde es versuchen. – user389955

Verwandte Themen