Допустим, есть функция отладки, упрощена здесь:Передача имя переменной в виде строки для работы с параметрами по умолчанию
void DumpString(char* var, char* varname) {
printf("%s : '%s'\n", varname, var);
}
char str[10]="foobar";
DumpString(str, "str");
> str : foobar
Давайте сделаем проще, удалив излишне постороннее требование прохождения переменной дважды, один раз в котировки:
#define VARASSTR(v) #v
void DumpString(char* var) {
printf("%s : '%s'\n", VARASSTR(var), var);
}
char str[10]="foobar";
DumpString(str);
> var : foobar
Упс! Он использует локальное переменное имя вместо одного передается в Попытаются другая (и менее идеальная) липкость:.
#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
Отлично работает. Но что, если функция была немного сложнее:
void DumpString(char* var, char* varname, int optionalvar=0) {
printf("%s : '%s'\n", varname, var);
printf("blah: %d", optionalvar);
}
Это невозможно перегрузить макрос, поэтому DumpStr
не будет работать, и мы уже исключили версию с VARASSTR
.
Как это можно обрабатывать (не прибегая к нескольким аналогичным, но по-разному названным функциям/макросам)?
«Как это можно обрабатывать (не прибегая к нескольким аналогичным, но по-разному названным функциям/макросам)?» Это невозможно. Вы не можете перегружать макросы. – meagar
Вы должны попробовать некоторый язык с возможностями отражения. Нет, действительно. – iehrlich
Вы можете использовать [Матричный трюк Variadic] (http: // stackoverflow.com/questions/5365440/variadic-macro-trick), чтобы «имитировать» перегрузку с помощью макросов. –