Стандарт кодирования GNU. : Форматирование Вашего исходного кода.

Вперед Назад Содержание

8. Форматирование Вашего исходного кода.

Важно помещать открывающую скобку, которая начинает тело функции на 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) для того, чтобы разделить программу на страницы в логических местах (но не внутри функции). Не важно, как велика страница, поскольку они не должны попадать на печатные страницы. Символ перевода страницы должен быть единственным символом в строке.


Вперед Назад Содержание