你如何缩进预处理器语句?

时间:2010-06-04 15:02:28

标签: c++ indentation code-formatting

当有许多预处理器语句和许多#ifdef级联时,很难得到概述,因为通常它们不会缩进。 e.g。

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

当我考虑缩进这些预处理器语句时,我担心会与一般缩进级别混淆。那么你如何以一种美丽的方式解决这个问题呢?

5 个答案:

答案 0 :(得分:20)

正如你所说,我还没有考虑缩进的最佳方法,但是我在不止一个地方找到了这个替代缩进,其中#总是放在第一列,只是关键字是缩进的:

#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
    }
  }
}

在这一点上,它变成了个人品味的问题,就像许多其他缩进风格一样。

答案 1 :(得分:18)

仅仅因为预处理指令“通常”没有缩进不是一个不缩进它们的好理由:

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

如果您经常对预处理指令进行多级嵌套,则应重新编写它们以使其更简单。

答案 2 :(得分:0)

首先,确保您确实需要所有ifdef语句。也许有一种方法可以重构它们以保持嵌套的数量,如果检查有限?假设你确实需要它们:

将第一部分(包含)分成单独的包含文件是个好主意:

your_header.h

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

然后在实现文件中,您可以保持更加理智。自由空白行和注释是我通常采用的非缩进#ifdef检查方法。

#ifndef __WIN32__
#ifdef SOMEOTHER

stmts

// SOMEOTHER
#endif

maybe stmts

// __WIN32__
#endif

所有这一切,没有规则,如果它使代码更具可读性,你就不能缩进预处理器检查。

答案 3 :(得分:0)

这个问题已经有很多有效的答案。对于想要视觉图像的人来说就是这样。

在Visual Studio中,转到选项搜索indent并选择您的语言。就我而言,它是c ++。当您在选项之间切换时,Visual Studio会向您显示以下示例。

enter image description here

答案 4 :(得分:-1)

&#34;所有这一切,没有规则,如果它使代码更具可读性,你就不能缩进预处理器检查。&#34;

不,但是在一个控制了样式且调整代码以匹配它的世界中,最好使样式缩进#if语句,如if语句。

虽然#if在技术上可能是一种不同的语言,但它是C / C ++规范的一部分,因为它不是任何当前关键字的字母匹配字母,所以没有理由#if可以不适合造型。