Angenommen, es gibt eine Debug-Funktion, vereinfacht hier arbeitet als:Passing Variablennamen als Zeichenfolge mit Standardparametern
void DumpString(char* var, char* varname) {
printf("%s : '%s'\n", varname, var);
}
char str[10]="foobar";
DumpString(str, "str");
> str : foobar
wir machen es einfacher, durch Entfernen der unnötigen Fremd Anforderung einer Übertragung der Variable zweimal, einmal in Zitate:
#define VARASSTR(v) #v
void DumpString(char* var) {
printf("%s : '%s'\n", VARASSTR(var), var);
}
char str[10]="foobar";
DumpString(str);
> var : foobar
Hoppla! Es nutzt die lokale Variablennamen statt den übergebenen Lassen Sie uns versuchen, eine andere (und weniger ideal) tack.
#define DumpStr(v) DumpString(v, #v)
void DumpString(char* var, char* varname) {
printf("%s : '%s'\n", varname, var);
}
char str[10]="foobar";
DumpStr(str);
> str : foobar
Groß es funktioniert. Was aber, wenn die Funktion ein wenig komplizierter war:
void DumpString(char* var, char* varname, int optionalvar=0) {
printf("%s : '%s'\n", varname, var);
printf("blah: %d", optionalvar);
}
Es ist nicht möglich, ein Makro zu überlasten, so wird DumpStr
nicht funktioniert, und wir haben bereits die Version mit VARASSTR
ausgeschlossen.
Wie kann das gehandhabt werden (ohne auf mehrere ähnliche, aber anders benannte Funktionen/Makros zurückgreifen zu müssen)?
"Wie kann das gehandhabt werden (ohne auf mehrere ähnliche, aber anders benannte Funktionen/Makros zurückgreifen zu müssen)?" Es kann nicht. Sie können Makros nicht überladen. – meagar
Sie sollten eine Sprache mit Reflexionsfunktionen ausprobieren. Nicht wirklich. – iehrlich
Sie könnten [Variadic Makrotrick] (http: // stackoverflow.com/questions/5365440/variadic-macro-trick), um das Überladen mit Makros zu "simulieren". –