c – 将变量名称作为字符串传递给默认参数

c – 将变量名称作为字符串传递给默认参数,第1张

概述假设有一个调试功能,简化如下: void DumpString(char* var, char* varname) { printf("%s : '%s'\n", varname, var);}char str[10]="foobar";DumpString(str, "str");> str : foobar 让我们更容易通过删除两次传递变量的不必要的无关要求,一次在引号中: 假设有一个调试功能,简化如下:

voID DumpString(char* var,char* varname) {    printf("%s : '%s'\n",varname,var);}char str[10]="foobar";DumpString(str,"str");> str : foobar

让我们更容易通过删除两次传递变量的不必要的无关要求,一次在引号中:

#define VarasstR(v) #vvoID 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,var);}char str[10]="foobar";DumpStr(str);> str : foobar

太棒了.但是如果函数稍微复杂一点怎么办:

voID DumpString(char* var,char* varname,int optionalvar=0) {    printf("%s : '%s'\n",var);    printf("blah: %d",optionalvar);}

不能重载宏,因此DumpStr不起作用,我们已经排除了VarasstR的版本.

如何处理(不使用多个类似但不同名称的函数/宏)?

解决方法 这是非标准的,但作为GNU C的扩展:

#define DumpStr(v,...) DumpString(v,#v,##__VA_ARGS__)

在GNU C中,您可以不向可变参数宏传递任何参数,并且在逗号和空可变参数列表之间应用“标记粘贴运算符”##时不会产生任何内容(因此尾随逗号被抑制).

在Visual C中,我认为令牌粘贴 *** 作符##是不必要的(并且可能会破坏宏),因为如果它出现在空的可变参数列表之前,Visual C会自动抑制尾随逗号.

请注意,唯一使这种非标准的是希望有时传递一个空参数列表. Variadic宏在C99和C 11中都是标准化的.

编辑:这是一个不使用非标准功能的示例.你可以看到为什么有些人真的希望在标准中解决这类问题:

#define DUMPSTR_1(v) DumpString(v,#v)#define DUMPSTR_2(v,opt) DumpString(v,opt)#define DUMPSTR_NARG(...) DUMPSTR_ARG_N(__VA_ARGS__,4,3,2,1,0)#define DUMPSTR_ARG_N(_1,_2,_3,_4,n,...) n#define DUMPSTR_NC(f,...) f(__VA_ARGS__)#define DUMPSTR_NB(nargs,...) DUMPSTR_NC(DUMPSTR_ ## nargs,__VA_ARGS__)#define DUMPSTR_NA(nargs,...) DUMPSTR_NB(nargs,__VA_ARGS__)#define DumpStr(...) DUMPSTR_NA(DUMPSTR_NARG(__VA_ARGS__),__VA_ARGS__)

可能有一些更简洁的方法来做到这一点.但不是那么多.

编辑2:这是另一个不使用非标准功能的例子,由R..提供

#define STRINGIFY_IMPL(s) #s#define STRINGIFY(s) STRINGIFY_IMPL(s)#define ARG1_IMPL(a,...) a#define ARG1(...) ARG1_IMPL(__VA_ARGS__,0)#define DumpStr(...) DumpString(STRINGIFY(ARG1(__VA_ARGS__)),__VA_ARGS__)

请注意,这需要更改DumpString的参数顺序,以便字符串化的函数名称是第一个参数.

总结

以上是内存溢出为你收集整理的c – 将变量名称作为字符串传递给默认参数全部内容,希望文章能够帮你解决c – 将变量名称作为字符串传递给默认参数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1225892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存