Подтвердить что ты не робот

Как вы делаете инструкции для препроцессора?

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

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

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

4b9b3361

Ответ 1

Просто потому, что директивы предварительной обработки "обычно" не имеют отступов, не является хорошей причиной, чтобы не отступать от них:

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

Если вы часто используете несколько уровней вложенности директив предварительной обработки, вы должны переделать их, чтобы упростить их.

Ответ 2

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

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

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

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

(a)

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

(b)

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

(c)

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

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

Ответ 3

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

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

В your_header.h:

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

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

#ifndef __WIN32__
#ifdef SOMEOTHER

stmts

// SOMEOTHER
#endif

maybe stmts

// __WIN32__
#endif

Все, что сказал, нет правила, что вы не можете выполнить предварительный запрос отступа, если он делает код более удобочитаемым.

Ответ 4

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

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

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