How do you indent preprocessor statements?

Just because preprocessing directives are "normally" not indented is not a good reason not to indent them:

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

If you frequently have multiple levels of nesting of preprocessing directives, you should rework them to make them simpler.


As you, I didn't make my mind yet about the best way to indent, but I found in more than one place this alternative indentation in which the # is placed always at the first column and just the keyword is indented:

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

In Visual Studio, when you type # as the first character it always brings its indentation to the left, so it seems that MS either favors never indenting preprocessor statements, or using the above format.

The big problem is when you have non-preprocessor and preprocessor statements mixed and indentation applied. It's hard to make code that looks good, no matter which option:

option (a)

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

option (b)

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

option (c)

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

At this point, it becomes a question of personal taste, as so many other indentation styles.