Важно помещать открывающую скобку, которая начинает тело функции на C в нулевой колонке, и избегать появления других открывающих или закрывающих скобок в нулевой колонке. Имеется несколько инструментов, которые просматривают исходный текст и ищую открывающую фигурную скобку в нулевой колонке для того, чтобы найти начало функции. Эти инструменты не будут работать с кодом, отформатированным без учета этого соглашения.
Так же важно, чтобы в описании функции ее имя начиналось в колонке ноль. Это помогает людям искать определение функции, и может так же помочь некоторым инструментам распознать его. Таким образом, правильное оформление описания функции следующее:
static char *
concat (s1, s2) /* Name starts in column zero here */
char *s1, *s2;
{ /* Open brace in column zero here */
...
}
В случае, если Вы хотите использовать ANSI C, оформляйте описание
следующим образом:
static char *
concat (char *s1, char *s2)
{
...
}
Для ANSI C, если список аргументов не помещается на одной строке,
его следует разбивать, как указано в примере:
int
lots_of_args (int an_integer, long a_long, short a_short,
double a_double, float a_float)
...
Для тела функции, мы предпочитаем форматировать код, как указано
ниже:
if (x < foo (y, z))
haha = bar[4] + 5;
else
{
while (z)
{
haha += foo (z, z);
z--;
}
return ++x + bar ();
}
Мы считаем, что проще читать программу, когда она имеет пробелы
перед открывающимися скобками и после запятых. Особенно после запятых.
Когда Вы разрезаете выражение на несколько строк, разбивайте его перед оператором, а не после. Правильно делать так:
if (foo_this_is_long && bar > win (x, y, z)
&& remaining_condition)
Старайтесь избегать наличия двух операторов с разным приоритетом
на одном уровне отступа. Например, не следует писать так:
mode = (inmode[j] == VOIDmode
|| GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j)
? outmode[j] : inmode[j]);
Вместо этого, используйте дополнительные скобки, чтобы отступ
показывал вложенность:
mode = ((inmode[j] == VOIDmode
|| (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))
? outmode[j] : inmode[j]);
Вставляйте дополнительные скобки, для того, чтобы Emacs
самостоятельно выравнивал код. Например, следующие отступы будут
выглядеть хорошо, если Вы сделаете их руками, но Emacs может все
испортить:
v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ rup->ru_stime.tv_sec*1000 +rup->ru_stime.tv_usec/1000;
Но добавление пары скобок решает эту проблему:
v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ rup->ru_stime.tv_sec*1000 +rup->ru_stime.tv_usec/1000);
Конструкцию do-while следует форматировать следующим образом:
do
{
a = foo (a);
}
while (a > 0);
Следует использовать символы перевода страницы (control-L) для
того, чтобы разделить программу на страницы в логических местах (но не
внутри функции). Не важно, как велика страница, поскольку они не
должны попадать на печатные страницы. Символ перевода страницы должен
быть единственным символом в строке.