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

29

当有很多预处理语句和很多 #ifdef 级联时,通常它们不会进行缩进,这使得很难获得总体概览。例如:

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

如果我同时考虑将预处理器语句的缩进也调整好,我担心会与一般的缩进水平混淆。那么你如何以简洁美观的方式解决这个问题呢?


2
我花费的时间去除 #ifdef 的代码比缩进它们的时间还要多。 :-) - Amardeep AC9MF
5个回答

27

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

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

如果你经常有多层嵌套的预处理指令,你应该重新设计它们以使其更简单。


1
纯 ANSI C 不允许这样做:请参见 https://dev59.com/rXRA5IYBdhLWcg3w4iKA。 - Dipan Mehta
19
那个帖子的意思并不是这样。那个帖子说在标准化之前的 C 语言中不允许缩进预处理指令。这可能是正确的(我不确定,但这并不重要,因为 C 语言已经标准化了22年)。然而,在标准 C(C90 和 C99,通常被称为“ANSI C”)以及 C++ 中,预处理指令可以缩进。 - James McNellis

25

像你一样,我也还没有确定最好的缩进方式,但我在多个地方发现了这种备选缩进方式,即将#号始终放置在第一列,只缩进关键字:

#ifdef __WIN32__
#  include <pansen_win32>
#else
#  include <..>
#endif
在Visual Studio中,当您将#作为第一个字符键入时,它总是将其缩进到左侧,因此看起来微软要么偏爱不对预处理器语句进行缩进,要么使用上述格式。
当非预处理器和预处理器语句混合使用并应用缩进时,存在一个大问题。无论选择哪个选项,都很难编写出好看的代码:
选项(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
    }
  }
}
for (...)
{
  if (foo)
  {
    if (bar)
    {
#     ifdef __WIN32__
        c = GetTickCount();
#     else
        c = clock();
#     endif
    }
  }
}

到这个时候,这就成为一个个人口味的问题,就像许多其他缩进风格一样。


5
我支持B选项,但是c = ...语句也需要缩进。 - endolith

6

这个问题已经有很多有效的答案了。对于想要视觉图像的人,这里有一个。

在Visual Studio中,前往选项并搜索缩进,选择您的语言。在我的情况下,是C++。当您在选项之间切换时,Visual Studio将在下面显示一个示例。

输入图片描述


0
首先,请确保您实际上需要所有的ifdef语句。也许有一种重构它们以限制嵌套if检查数量的方法?假设您确实需要它们:
将第一部分(包括)分离到单独的包含文件中是一个好主意:
your_header.h中:
#ifdef __WIN32__
#include <pansen_win32>
#else
#include <..>
#endif

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

#ifndef __WIN32__
#ifdef SOMEOTHER

stmts

// SOMEOTHER
#endif

maybe stmts

// __WIN32__
#endif

话虽如此,如果缩进预处理器检查可以使代码更易读,那么并没有规定你不能这样做。


-1

尽管如此,如果缩进预处理器检查可以使代码更易读,则没有规则禁止这样做。

不过,在一个风格受控且代码被调整以匹配该风格的世界中,启用缩进#if语句就像if语句一样是很好的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接