Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C宏/#定义缩进?_C_Macros_Portability_Indentation - Fatal编程技术网

C宏/#定义缩进?

C宏/#定义缩进?,c,macros,portability,indentation,C,Macros,Portability,Indentation,我很好奇为什么几乎所有的C宏都是这样格式化的: #ifndef FOO # define FOO #endif 或者这个: #ifndef FOO #define FOO #endif 但决不能这样: #ifndef FOO #define FOO #endif (此外,vim的=操作符似乎只将前两个计算为正确。) 这是由于编译器之间的可移植性问题,还是仅仅是一种标准做法?IIRC,旧的C预处理器要求#是行中的第一个字符(尽管我从未遇到过有此要求的预处理器) 我从未见过像第一个

我很好奇为什么几乎所有的C宏都是这样格式化的:

#ifndef FOO
#   define FOO
#endif
或者这个:

#ifndef FOO
#define FOO
#endif
但决不能这样:

#ifndef FOO
    #define FOO
#endif
(此外,vim的
=
操作符似乎只将前两个计算为正确。)


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

IIRC,旧的C预处理器要求#是行中的第一个字符(尽管我从未遇到过有此要求的预处理器)

我从未见过像第一个示例那样的代码。我通常编写预处理器指令,如第二个示例所示。我发现它在视觉上对实际代码的缩进干扰更少(我不再用C写了)

报告说:

预处理指令是 以“#”开头的程序。 前后允许空白 “#”一词


我已经看到了这三种方式,这似乎是风格的问题,而不是语法的问题


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

预处理器指令是程序中包含的行,它们实际上不是程序语句,而是预处理器的指令。这些行的前面总是有一个散列符号(#)。在“#”之前和之后允许有空格。一旦找到换行符,预处理器指令即被视为结束


就C/C++标准而言,没有其他规则,因此它仍然是样式和可读性问题,我只以您发布的第二种方式看到/编写程序,尽管第三种方式看起来更可读

首选第三种样式,但include-guard除外,我使用第二种样式

我一点也不喜欢第一种风格——我认为
#define
是一条预处理器指令,尽管它确实不是,但它是一条
#
然后是预处理器指令
define
。但既然我这么想,把它们分开似乎是不对的。我希望由提倡这种风格的人编写的文本编辑器将有一个块缩进/取消缩进,可以处理以这种风格编写的代码。但我不想在使用文本编辑器时遇到它


迎合古老的预处理器是没有意义的,因为#必须是行的第一个字符,除非您还可以从头开始列出这些实现与标准C之间的所有其他差异,以避免您可能做的其他他们不支持的事情。当然,如果你真的在使用预标准编译器,这是很公平的。

还有一个额外的问题(如问题中提到的OP),那就是编辑们通常对预处理器条件块应该(或不应该)缩进有自己的想法。旧的VAX C编译器(大约1986年)如果预处理器指令的第一列中没有
#
,则会引发错误。