谷歌C++风格指南.为什么要先输入后输出参数排序

Google C++ Style Guide. Why input-then-output parameter ordering?

本文关键字:输入 输出 参数 排序 风格 C++ 为什么 谷歌      更新时间:2023-10-16

在Google C++ Style Guide中,它说:

定义函数时,参数顺序为:输入,然后是输出。

基本上谷歌建议函数参数排序如下:

void foo(const Foo& input1, const Foo& input2, Foo* output);

但是,我的同事建议将输出放在第一个位置。 因为通过这种方式,Foo可以接受默认值,而大多数时候输出不会使用默认值。 例如:

void foo(Foo* output, const Foo& input1, const Foo& input2 = default);

我认为他说的是有道理的。还是我们在可读性、性能等方面缺少一些东西?为什么风格指南建议输出应该是最后一个?

对于Google风格指南来说,这不是问题的原因是因为不允许使用默认参数:

https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Default_Arguments

我们不允许使用默认函数参数,除非在下面解释的有限情况下。如果适用,请改为使用函数重载来模拟它们。

优点

通常,您有一个使用默认值的函数,但有时您希望覆盖默认值。默认参数允许一种简单的方法来执行此操作,而无需为罕见的异常定义许多函数。与重载函数相比,默认参数具有更简洁的语法,更少的样板文件,并且"必需"和"可选"参数之间的区别更清晰。

缺点

函数

指针在存在默认参数时令人困惑,因为函数签名通常与调用签名不匹配。向现有函数添加默认参数会更改其类型,这可能会导致代码获取其地址时出现问题。添加函数重载可避免这些问题。此外,默认参数可能会导致代码量更大,因为它们在每个调用站点上都复制 - 与重载函数相反,其中"默认"仅出现在函数定义中。

决定

虽然上面的缺点并不那么繁重,但它们仍然超过了函数重载默认参数的(小)好处。因此,除了下面描述的情况外,我们要求显式指定所有参数。

一个特定的例外是当函数是 .cc 文件中的静态函数(或未命名命名空间中)时。在这种情况下,缺点不适用,因为函数的使用是如此本地化。

此外,构造函数中允许使用默认函数参数。上面列出的大多数缺点都不适用于构造函数,因为不可能获取它们的地址。

另一个特定的例外是使用默认参数来模拟可变长度参数列表时。

// Support up to 4 params by using a default empty AlphaNum.
string StrCat(const AlphaNum &a,
              const AlphaNum &b = gEmptyAlphaNum,
              const AlphaNum &c = gEmptyAlphaNum,
              const AlphaNum &d = gEmptyAlphaNum);