C++ 如何缩进预处理器语句?

C++ 如何缩进预处理器语句?,c++,indentation,code-formatting,C++,Indentation,Code Formatting,当有许多预处理器语句和许多#ifdef级联时,很难获得概述,因为它们通常不缩进。e、 g #ifdef __WIN32__ #include <pansen_win32> #else #include <..> #ifdef SOMEOTHER stmts #endif maybe stmts #endif #ifdef_uuwin32__ #包括 #否则 #包括 #如果有人 STMT #恩迪夫 也许是STMT #恩迪夫 当我考虑缩进这些预处理器语句时,我担心会与一般

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

#ifdef __WIN32__
#include <pansen_win32>
#else
#include <..>
#ifdef SOMEOTHER
stmts
#endif
maybe stmts
#endif
#ifdef_uuwin32__
#包括
#否则
#包括
#如果有人
STMT
#恩迪夫
也许是STMT
#恩迪夫

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

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

#ifdef __WIN32__
    #include <pansen_win32>
#else
    #include <..>
    #ifdef SOMEOTHER
        stmts
    #endif
    maybe stmts
#endif
#ifdef_uuwin32__
#包括
#否则
#包括
#如果有人
STMT
#恩迪夫
也许是STMT
#恩迪夫

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

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

最好将第一部分(include)分离到一个单独的include文件中:

您的_header.h
中:

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

尽管如此,没有规则规定不能缩进预处理器检查它是否使代码更具可读性。

正如您所说,我还没有决定缩进的最佳方式,但我在不止一个地方发现了这种替代缩进方式,即#始终放在第一列,只缩进关键字:

#ifdef __WIN32__
#  include <pansen_win32>
#else
#  include <..>
#endif
备选方案(b)

备选方案(c)

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

“尽管如此,没有规则不能缩进预处理器检查代码是否更具可读性。”

不,但在一个控制样式并调整代码以匹配的世界中,最好启用样式缩进
#if
语句,如
if
语句


虽然
#if
在技术上可能是一种不同的语言,但它是C/C++规范的一部分,并且它不是任何当前关键字的字母匹配,因此没有理由在样式中不能容纳
#if
s。

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

在visual studio中,转到选项搜索缩进并选择您的语言。在我的例子中,它是C++。在选项之间切换时,VisualStudio将向您展示下面的示例


我删除#ifdef的时间比缩进它们的时间要多。:-)纯ANSI C不允许这样做:请看。@DipanMehta:那个线程不是这么说的。该线程表示,前标准C不允许缩进预处理指令。这可能是真的(我不知道,因为C已经标准化22年了,所以这没什么大不了的)。但是,在标准C(C90和C99)中,通常都称为“ANSI C”,C++中,预处理指令可能缩进。
#ifdef __WIN32__
#  include <pansen_win32>
#else
#  include <..>
#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
    }
  }
}
for (...)
{
  if (foo)
  {
    if (bar)
    {
#     ifdef __WIN32__
        c = GetTickCount();
#     else
        c = clock();
#     endif
    }
  }
}