9.6. 函数调用

总述

要么一行写完函数调用, 要么在圆括号里对参数分行, 要么参数另起一行且缩进四格. 如果没有其它顾虑的话, 尽可能精简行数, 比如把多个参数适当地放在同一行里.

说明

函数调用遵循如下形式:

  1. bool retval = DoSomething(argument1, argument2, argument3);

如果同一行放不下, 可断为多行, 后面每一行都和第一个实参对齐, 左圆括号后和右圆括号前不要留空格:

  1. bool retval = DoSomething(averyveryveryverylongargument1,
  2. argument2, argument3);

参数也可以放在次行, 缩进四格:

  1. if (...) {
  2. ...
  3. ...
  4. if (...) {
  5. DoSomething(
  6. argument1, argument2, // 4 空格缩进
  7. argument3, argument4);
  8. }

把多个参数放在同一行以减少函数调用所需的行数, 除非影响到可读性. 有人认为把每个参数都独立成行, 不仅更好读, 而且方便编辑参数. 不过, 比起所谓的参数编辑, 我们更看重可读性, 且后者比较好办:

如果一些参数本身就是略复杂的表达式, 且降低了可读性, 那么可以直接创建临时变量描述该表达式, 并传递给函数:

  1. int my_heuristic = scores[x] * y + bases[x];
  2. bool retval = DoSomething(my_heuristic, x, y, z);

或者放着不管, 补充上注释:

  1. bool retval = DoSomething(scores[x] * y + bases[x], // Score heuristic.
  2. x, y, z);

如果某参数独立成行, 对可读性更有帮助的话, 那也可以如此做. 参数的格式处理应当以可读性而非其他作为最重要的原则.

此外, 如果一系列参数本身就有一定的结构, 可以酌情地按其结构来决定参数格式:

  1. // 通过 3x3 矩阵转换 widget.
  2. my_widget.Transform(x1, x2, x3,
  3. y1, y2, y3,
  4. z1, z2, z3);