Как вы отступаете от заявлений препроцессора? - PullRequest
22 голосов
/ 04 июня 2010

Когда имеется много операторов препроцессора и много каскадов #ifdef, сложно получить обзор, так как обычно они не имеют отступов. например,

#ifdef __WIN32__
#include <pansen_win32>
#else
#include <..>
#ifdef SOMEOTHER
stmts
#endif
maybe stmts
#endif

Когда я рассматриваю также отступ в этих заявлениях препроцессора, я боюсь запутаться с общим уровнем отступа. Итак, как вы решаете это красиво?

Ответы [ 4 ]

20 голосов
/ 04 июня 2010

Как и вы, я еще не подумал о лучшем способе отступа, но нашел более чем в одном месте этот альтернативный отступ, в котором знак # всегда помещается в первый столбец, а только ключевое слово имеет отступ:

#ifdef __WIN32__
#  include <pansen_win32>
#else
#  include <..>
#endif

В Visual Studio, когда вы вводите # в качестве первого символа, он всегда переносит отступ влево, поэтому кажется, что MS либо предпочитает никогда не делать отступы для операторов препроцессора, либо использует вышеуказанный формат.

Большая проблема возникает, когда у вас смешаны непропроцессорные и препроцессорные операторы и применен отступ. Трудно сделать код, который выглядит хорошо, независимо от того, какой вариант:

опция (а)

for (...)
{
  if (foo)
  {
    if (bar)
    {
#ifdef __WIN32__
      c = GetTickCount();
#else
      c = clock();
#endif
    }
  }
}

опция (б)

for (...)
{
  if (foo)
  {
    if (bar)
    {
      #ifdef __WIN32__
      c = GetTickCount();
      #else
      c = clock();
      #endif
    }
  }
}

опция (с)

for (...)
{
  if (foo)
  {
    if (bar)
    {
#     ifdef __WIN32__
        c = GetTickCount();
#     else
        c = clock();
#     endif
    }
  }
}

На этом этапе это становится вопросом личного вкуса, как и многие другие стили отступов.

18 голосов
/ 04 июня 2010

Тот факт, что директивы предварительной обработки «обычно» не имеют отступов, не является веским основанием для того, чтобы не делать отступ:они проще.

0 голосов
/ 19 января 2016

«Все это говорит о том, что нет правила, согласно которому вы не можете делать отступы при проверке препроцессором, если он делает код более читабельным.»

Нет, но в мире, где стиль управляется и код корректируется для соответствия, было бы неплохо включить стиль для отступа #if операторов, таких как if операторов.

Хотя #if технически может быть другим языком, он является частью спецификации C / C ++, и поскольку он не является буквенно-буквенным совпадением любых текущих ключевых слов, нет причины, по которой #if s не может быть приспособлен в стиле.

0 голосов
/ 04 июня 2010

Во-первых, убедитесь, что вам действительно нужны все операторы ifdef. Возможно, есть способ реорганизовать их, чтобы ограничить число вложенных проверок? Если они вам нужны:

Было бы неплохо разделить первую часть (включения) на отдельный файл включения:

В your_header.h:

#ifdef __WIN32__
#include <pansen_win32>
#else
#include <..>
#endif

Затем в файле реализации вы можете сохранить все более разумным. Либеральные пустые строки и комментарии - это подход, который я обычно применяю в отношении неотмеченных #ifdef проверок.

#ifndef __WIN32__
#ifdef SOMEOTHER

stmts

// SOMEOTHER
#endif

maybe stmts

// __WIN32__
#endif

Все это говорит о том, что не существует правила, согласно которому вы не можете делать отступы при проверке препроцессором, если он делает код более читабельным.

...