为什么将结构传递给函数而不是单独的参数? [复制]

2024-04-20

假设您调用这样的函数:

someFunc( some_int, some_float, false, "whatever text");

这看起来不太好,但如果我通过结构/类传递它们,它看起来也不会好得多,因为我将像处理函数参数一样即时构建结构。

someFunc( FuncParameters( some_int, some_float, false, "whatever text"));

即使结构体的定义中有参数名称,当我调用它的构造函数时我也看不到这些参数名称。

我可以这样做:

FuncParameters func_parameters;
func_parameters.some_int_data = some_int;
func_parameters.some_float_data = some_float;
func_parameters.some_text_data = "whatever text";

someFunc(func_parameters);

但如果我忘记了上面的 bool-data,那么就没有什么可以抱怨的。

那么为什么人们说“如果参数数量超过 X,则始终在结构中传递参数?我错过了什么?”


使用结构而不是单独的参数有几个优点:

  • 您表示数据是相关的。通过适当地命名结构,您可以为该关系命名。
  • 结构体分组相关数据有机会在代码中的其他地方重用。
  • 一旦修改结构(添加/删除成员),您就不需要调整参数列表。如果您通过多个函数进行调用,并且仅传递结构对象,则尤其如此。
  • 呼叫站点的指定成员 (soldier.speed = 3.2;)比简单地传递更清晰3.2。这更适用于布尔文字和函数调用,例如CreateSoldier(3.2, true, false, true).

还有一些事情需要记住:

  • 传递结构的方式(通过值或指针)会影响复制的数据量,以及在运行时是否有额外的取消引用。
  • 对于简单的代码,创建一个结构体只是将其传递给函数实际上会增加代码的冗长性并降低代码的可读性。
  • 只有在 C99 中你才有复合文字 https://en.cppreference.com/w/c/language/compound_literal。对于旧版本的 C,不可能传递临时对象,并且您需要显式声明变量。
  • 正如您所注意到的,一个设计良好的函数可以强制所有参数的初始化;但您在调用站点看不到参数的名称。对于不带很多参数的函数,可以通过适当地命名函数来缓解这种情况(例如SetSpeed(&soldier, 3.2)).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么将结构传递给函数而不是单独的参数? [复制] 的相关文章

随机推荐