我正在编写一个 API,它可以更新结构中的许多不同字段。
我可以通过使更新函数可变参数来帮助添加未来的字段:
update(FIELD_NAME1, 10, FIELD_NAME2, 20);
然后稍后添加FIELD_NAME3
无需更改任何现有调用:
update(FIELD_NAME1, 10, FIELD_NAME2, 20, FIELD_NAME3, 30);
请赐教智慧之言?
一般来说,不会。
Varargs 抛出了很多类型安全性 - 你可以传递指针、浮点数等,而不是整数,并且它会毫无问题地编译。滥用可变参数(例如省略参数)可能会因堆栈损坏或读取无效指针而导致奇怪的崩溃。
例如,以下调用将编译并导致崩溃或其他奇怪的行为:
UpdateField(6, "Field1", 7, "Field2", "Foo");
最初的 6 是期望的参数数量。它将字符串指针“Foo”转换为 int 以放入 Field2,并且它将尝试读取和解释两个不存在的其他参数,这可能会因取消引用堆栈噪音而导致崩溃。
我相信 C 中 varargs 的实现是一个错误(考虑到今天的环境 - 它可能在 1972 年是完全有意义的。)实现是你在堆栈上传递一堆值,然后被调用者将在堆栈中拾取参数,基于关于一些初始控制参数的解释。这种类型的实现基本上会让您以一种很难诊断的方式犯错误。 C# 对此的实现(在方法上传递带有属性的对象数组)必须更明智,尽管不能直接映射到 C 语言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)