这种奇怪的格式有什么优势?

时间:2008-10-23 18:31:32

标签: coding-style

我在一些C ++代码中看到过这种用于逗号分隔列表的格式(尽管这可能适用于任何语言):

void function(  int a
              , int b
              , int c
             )

我想知道为什么有人会使用更常见的格式,例如:

void function (int a,
               int b,
               int c
              )

12 个答案:

答案 0 :(得分:17)

编写SQL语句时,这是一种非常常见的编码风格:

SELECT field1
     , field2
     , field3
--   , field4
     , field5
FROM tablename

优点:

  • 允许您轻松添加,删除或重新排列字段,而无需担心最终的尾随逗号。
  • 让您轻松注释掉一行(TSQL使用“ - ”)而不会弄乱其余的语句。

我认为你不想像在SQL中那样频繁地重新排列函数中的参数顺序,所以也许这只是某人的习惯。

将其中一个评论出来的能力将取决于所使用的特定语言。不确定C ++。我知道VB.Net不会允许它,但那是因为它需要一个连续字符(_)来跨行分割语句。

答案 1 :(得分:3)

最后通过复制上一个参数(行)来添加参数更容易。

当您确定第一个参数永远不会改变时(通常是这种情况),这是有意义的。

答案 2 :(得分:3)

恶意?

说真的,有时候很难考虑格式化风格。这主要取决于个人品味。就个人而言,我认为两种形式都有点讨厌,除非你在行长方面受到严重限制。

答案 3 :(得分:2)

另一个优点是,在第一个示例中,您可以注释掉B或C行,并且它将在语法上保持正确。在第二个示例中,如果您尝试注释掉C行,则会出现语法错误。

如果你问我,不值得把它弄得那么难看。

答案 4 :(得分:1)

我会看到的唯一好处是,当您添加参数时,您只需要复制并粘贴最后一行,从而节省编辑逗号位置的额外几个关键笔划等。

答案 5 :(得分:1)

对我而言似乎是个人选择。

答案 6 :(得分:1)

当快速扫描文件时,很明显以逗号开头的每一行都是它上面一行的延续(与简单地比上面的那一行缩进的行相比)。这是以下风格的概括:

std::cout << "some info "
    << "some more info " << 4
    + 5 << std::endl;

(请注意,在这种情况下,分解4 + 5是愚蠢的,但如果你有一个复杂的数学陈述,则可能是必要的。)

我经常使用它,特别是在处理if,for和while语句等条件时。因为单行条件通常省略了curlies。

 std::vector<int> v = ...;
 std::vector<int> w = ...;
 for (std::vector<int>::iterator i = v.begin()
       , std::vector<int>::iterator j = w.begin()
       ; i != v.end() && j != w.end()
       ; ++i, ++j)
           std::cout << *i + *j << std::endl;

答案 7 :(得分:1)

没有理由,我怀疑这只是个人偏好的问题。

我个人更喜欢第二种。

void function (int a,
               int b,
               int c
              )

答案 8 :(得分:1)

  

我会看到的唯一好处是,当您添加参数时,您只需要复制并粘贴最后一行,从而节省编辑逗号位置的额外几个关键笔划等。

如果要删除最后一个参数,也是如此。

答案 9 :(得分:1)

当您向末尾添加另一个字段时,您添加的单行包含新的逗号,从而产生单行添加的差异,使得在将来某个时间查看更改日志时更容易看到更改的内容。

答案 10 :(得分:1)

似乎大多数答案都围绕着评论或轻松添加新参数的能力。但似乎你将逗号放在行的末尾而不是开头时得到同样的效果:

function(
          int a,
          int b,
//          int c,
          int d
        )

你可能会说你不能对最后一个参数这样做,你会是对的,但是对于另一个形式,你不能对第一个参数这样做:

function (
//             int a
           , int b
           , int c
           , int d
          )

因此,权衡是能够注释掉第一个参数而不是能够注释掉最后一个参数+能够添加新参数而无需在前一个参数上添加逗号。

答案 11 :(得分:0)

我知道当我在sql或if语句中包装时,我会尝试确保并且是下一行的开头。

如果A和B
和C

我认为它清楚地表明C仍然是if的一部分。你展示的第一种格式可能就是这样。但与大多数风格问题一样,简单的问题是,如果团队决定采用一种风格,那么就应该坚持。