2009-12-06 144 views
8

我很好奇,为什么我看到此格式,几乎所有C宏:C宏/#定义缩进?

#ifndef FOO 
# define FOO 
#endif 

或者这样:

#ifndef FOO 
#define FOO 
#endif 

但从来没有这样的:

#ifndef FOO 
    #define FOO 
#endif 

(此外, vim的=运营商似乎只把前两个数字视为正确。)

这是由于编译器之间的可移植性问题,还是仅仅是一种标准做法?

回答

4

IIRC,旧的C预处理器要求#是行上的第一个字符(虽然我从来没有真正遇到过这样的需求)。

我从来没有像你的第一个例子看到你的代码。我通常会在第二个例子中编写预处理指令。我发现它在视觉上干扰了实际代码的缩进量(不是我用C编写的)。

GNU C Preprocessor manual说:

预处理指令是 你的程序行以 '#' 开始。 '#'前后允许有空格。

+0

还有一些额外的刺激(如问题中提到的OP),编辑人员经常对预处理器条件块应该如何(或不能)缩进有自己的想法。 – 2009-12-06 08:34:02

+1

旧的VAX C编译器(大约1986年)如果预处理器指令在第一列中没有'#',将会引发错误。 – 2009-12-07 21:49:47

7

我已经看到了它做了所有三种方式,这似乎是一个风格问题,而不是语法

虽然通常第二个例子是最常见的,我见过的情况下,第一(或第三个)用于帮助区分#ifdefs的多个级别。有时候逻辑可能变得深深嵌套,一眼就能理解它的唯一方法就是使用缩进,就像通常的做法一样,在{和}之间缩进代码块。

1

预处理指令是我们的程序中包含的行,它们实际上并不是程序语句,而是预处理程序的指令。这些行总是以散列符号(#)开头,在'#'之前和之后都允许有空格。只要找到换行符,预处理器指令就会结束。

关于C/C++的标准还没有其他规则,所以它仍然是风格和可读性问题的问题,我已经看到/编写的程序只是以第二种方式发布,尽管第三个似乎更具可读性。

3

对于首选项,我使用第三种样式,但使用第二种样式的防护装置除外。

我不喜欢第一种风格 - 我认为#define是一个预处理指令,尽管当然不是,但它是#,后跟预处理指令define。但是,既然我这样想,分开它们似乎是错误的。我希望倡导这种风格的人编写的文本编辑器将有一个块缩进/缩进,用于以该风格编写的代码。但我不愿意使用没有的文本编辑器来遇到它。

对于古代预处理器来说,没有任何意义的地方,其中#必须是该行的第一个字符,除非您还可以列出这些实现与标准C之间的所有其他区别,以避免其他的事情你可能会做,他们不会支持。当然,如果你真的在使用预标准的编译器,那就够公平的了。