我很好奇为什么我看到几乎所有C格式的格式都是这样的:
#ifndef FOO
# define FOO
#endif
或者这个:
#ifndef FOO
#define FOO
#endif
但从来没有这样:
#ifndef FOO
#define FOO
#endif
(此外,vim的=
运算符似乎只计算前两个是正确的。)
这是由于编译器之间的可移植性问题,还是仅仅是标准做法?
答案 0 :(得分:7)
我已经看到它完成了所有三种方式,它似乎是一种风格问题,而不是语法问题
虽然通常第二个例子是最常见的,但我见过第一个(或第三个)用于帮助区分多个#ifdef级别的情况。有时逻辑可以变得非常嵌套,并且一目了然地理解它的唯一方法是使用缩进,就像在{和}之间缩进代码块一样常见的做法。
答案 1 :(得分:4)
我从未见过你的代码就像你的第一个例子。我通常在第二个例子中编写预处理程序指令。我发现它在视觉上干扰了实际代码的缩进(不再是我用C写的了)。
预处理指令是行 你的程序以'#'开头。 之前和之后允许空格 '#'。
答案 2 :(得分:3)
首选我使用第三种样式,但包含警戒除外,我使用第二种样式。
我根本不喜欢第一种风格 - 我认为#define
是一个预处理器指令,即使它当然不是,它是#
后跟预处理器指令define
。但既然我确实这么想,将它们分开似乎是错误的。我希望由倡导该风格的人编写的文本编辑器将具有一个块缩进/非缩进,适用于以该样式编写的代码。但我不愿意使用没有的文本编辑器来遇到它。
对于古老的预处理器而言,#必须是该行的第一个字符是没有意义的,除非您还可以列出这些实现与标准C之间的所有其他差异,以避免你可能做的其他事情,他们不会支持。当然,如果您真的使用预标准编译器,那么公平。
答案 3 :(得分:1)
预处理程序指令是程序中包含的行,它们实际上不是程序语句,而是预处理程序的指令。这些行总是以井号(#)开头。在'#'之前和之后允许空格。一旦找到换行符,就会认为预处理程序指令结束。
关于C / C ++的标准,目前还没有其他规则,所以它仍然是风格和可读性问题,我只是以你发布的第二种方式看到/编写程序,尽管第三种似乎更具可读性。