我很好奇为什么我几乎看到所有的C宏都是这样格式化的:
#ifndef FOO
# define FOO
#endif
或者这样:
#ifndef FOO
#define FOO
#endif
但绝不会出现这种情况:
#ifndef FOO
#define FOO
#endif
此外,Vim的=
操作符似乎只将前两项视为正确。这是由于编译器之间的可移植性问题,还是标准实践呢?我很好奇为什么我几乎看到所有的C宏都是这样格式化的:
#ifndef FOO
# define FOO
#endif
或者这样:
#ifndef FOO
#define FOO
#endif
但绝不会出现这种情况:
#ifndef FOO
#define FOO
#endif
此外,Vim的=
操作符似乎只将前两项视为正确。这是由于编译器之间的可移植性问题,还是标准实践呢?我更喜欢第三种风格,但包含保护除外,对于保护我使用第二种风格。
我不太喜欢第一种风格 - 我认为#define
是预处理指令,即使实际上它不是,它是一个#
后跟预处理指令define
。但是由于我确实这样想,将它们分开似乎是错误的。我希望支持该风格的人编写的文本编辑器能够对该风格的代码进行块缩进/取消缩进。但是,如果使用不支持该风格的文本编辑器,则会感到非常不舒服。
除非您可以列出所有其他实现与标准C之间的区别,以避免可能不支持的其他操作,否则没有必要迎合古老的预处理器,其中#必须是行的第一个字符。当然,如果您真的正在使用早期的编译器,那就没问题。
预处理器指令是包含在我们程序中的行,它们实际上不是程序语句,而是预处理器的指令。这些行总是以井号(#)开头。在'#'之前和之后允许有空格。一旦发现换行符,预处理器指令就被认为结束。
就C/C++标准而言,没有其他规则,因此它仍然是样式和可读性问题,我只看到/编写了第二种你发布的方式,尽管第三种方式似乎更易读。
#
,则会抛出错误。 - John Bode