Форматирование исходного кода

Базовые принципы

  1. Форматирование исходного кода должно отвечать структуре программы. В C используется понятие вложенности: операторы находятся в теле функции, каждый оператор if, while, switch, do .. while создает новый уровень вложенности. Операторы, принадлежащие различным уровням, должны выделяться с помощью соответствующих отступов.

    Пример:

    int main()                          /* 0-й уровень */
    {                                   /* 0-й уровень */
        printf("hi\n");                     /* 1-й уровень */
    
        if (f() == 2)                       /* 1-й уровень */
            do_something();                     /* 2-й уровень */ 
        else {                              /* 1-й уровень */
            do_other();                         /* 2-й уровень */
            do_this_after_all();                /* 2-й уровень */
        }                                   /* 1-й уровень */
    }                                   /* 0-й уровень */
    
  2. Одна строка — один оператор.

  3. Если какой-то стиль выбран (см. ниже), следует придерживаться его неукоснительно.

Стили расстановки скобок

K&R
int main(int argc, char *argv[])
{
    ...
    while (x == y) {
        something();
        somethingelse();
        if (some_error)
            do_correct();
        else
            continue_as_usual();
    }
    finalthing();
    ...
}
  • Открывающая скобка ставится на той же строке, что и оператор (исключение: открывающая скобка тела функции ставится на следующей строке).
  • Закрывающая скобка ставится на том же уровне, что и управляющий оператор, на отдельной строке.
Allman style
while (x == y)
{
    something();
    somethingelse();
}
finalthing();
  • В отличие от K&R, открывающая скобка ставится на отдельной строке и соответствует закрывающей.
Whitesmiths style (Wishart)
void MyFunc ()
    {
    while (x == y)
        {
        something();
        somethingelse();
        }

    finalthing();
    }

Другой пример:

if (data != NULL && res > 0)
    {
    if (!JS_DefineProperty(cx, o, "data", STRING_TO_JSVAL(JS_NewStringCopyN(cx, data, res)),
                           NULL, NULL, JSPROP_ENUMERATE))
        {
        QUEUE_EXCEPTION("Internal error!");
        goto err;
        }
    PQfreemem(data);
    }
else if (!JS_DefineProperty(cx, o, "data", OBJECT_TO_JSVAL(NULL),
        NULL, NULL, JSPROP_ENUMERATE))
    {
    QUEUE_EXCEPTION("Internal error!");
    goto err;
    }
  • Открывающие и закрывающие скобки ставятся на том же уровне, что и операторы внутри них.
GNU style
static char *
concat (char *s1, char *s2)
{
    while (x == y)
      {
        something ();
        somethingelse ();
      }
    finalthing ();
}
  • Скобки сдвинуты от предыдущего уровня на 2 пробела, операторы внутри скобок — еще на 2 пробела.
  • Для отделения аргументов от названия функции используется дополнительный пробел.
Horstmann style
while (x == y) 
{   something();
    somethingelse();
    //...
    if (x < 0)
    {   printf("Negative");
        negative(x);
    } 
    else 
    {   printf("Positive");
        positive(x);
    }
}
finalthing();
  • Вариация Allman style, экономящая строку на открывающей скобке.
Lisp style
 for (i = 0; i < 10; i++) {
     if(i % 2 == 0) {
         doSomething(i); }
     else {
         doSomethingElse(i); } }