假设有一个调试功能,这里简化为:
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
.
如何处理(不使用多个类似但名称不同的函数/宏)?