在哪里格式化/放置" {"在C?

时间:2014-10-05 04:53:16

标签: c coding-style

任何人都可以解释一下,为什么在这里:

void
st_clear(st_table *table)
{ //1 a new line
    register st_table_entry *ptr, *next;
    st_index_t i;

    if (table->entries_packed) { //2 the same line
        table->num_entries = 0;
        table->real_entries = 0;
        return;
    }

    for (i = 0; i < table->num_bins; i++) {
      ptr = table->bins[i];
      table->bins[i] = 0;
      while (ptr != 0) {
        next = ptr->next;
        st_free_entry(ptr);
        ptr = next;
      }
    }
    table->num_entries = 0;
    table->head = 0;
    table->tail = 0;
}

在一个案例中,他们离开同一行的{,而在另一个案例中,他们离开了新行?

https://github.com/ruby/ruby/blob/1b5acebef2d447a3dbed6cf5e146fda74b81f10d/st.c

我知道在C中没有像大多数其他语言那样明确的命名惯例,但在一个项目中{ 总是必须 在新线上或在同一条线上。

2 个答案:

答案 0 :(得分:4)

C标准本身没有任何要求放置令牌的内容,只要它们按正确的顺序排列即可。事实上:

i

     = j

++;

完全没问题,语法明智,尽管它的格式很严重:

i = j++;

话虽如此,您应该尽可能地坚持指南。在这种情况下,我们实际上并不知道指南是什么。

指南完全有可能说明功能和非功能的不同支撑位置。

答案 1 :(得分:0)

正如您所指出的,这是完全有效的,并且确实是许多常见缩进样式的一部分,例如: K&amp; R风格(维基百科有一些流行风格的summary

为什么在这种情况下完成此操作,如果没有为此代码遵循编码样式指南(有一些基本原理),很难回答,但有一个优点是,当且仅当有一行时才有函数定义匹配^[{],以便轻松找到它们。 (函数不嵌套在标准C中,因此{始终位于第一列,并且(显然)不是任何其他构造,其中{位于此编码样式的第一列约定。)

正如上面链接的维基百科文章所述,旧式定义可能是此惯例变得流行的另一个(虽然是历史性的)原因。

引入函数定义的{与复合语句开头的其他大括号不同,因为它是必需的(函数体是复合语句不能被其他语句替换的唯一情况,例如,int foo(void) return 5;无效)。这可能在某种程度上证明了在不同情况下放置其他大括号时的不一致性(如果你认为这样)。