何时使用空格是否允许可读性?

fen*_*eop 2 c whitespace coding-style

当谈到空白时,C似乎相当宽容.

我们可以在运算符周围使用或省略空格,在函数名称及其带括号的参数列表之间,在数组名称及其索引之间等,以使代码更具可读性.我理解这是一个偏好的问题.

我能想到的唯一不允许空白的地方是:

#include < stdio.h > // fatal error:  stdio.h : No such file or directory
Run Code Online (Sandbox Code Playgroud)

C中的其他上下文是什么,其中空格不能用于可读性?

Kei*_*son 5

在大多数情况下,在单个令牌中添加空格会使程序无效或更改令牌的含义.一个明显的例子:"foo"并且" foo "都是具有不同值的有效字符串文字,因为字符串文字是单个标记.更改123456123 456将其从单个整数常量更改为两个整数常量,从而导致语法错误.

这种情况的例外涉及预处理器.

你已经提到了这个#include指令.请注意:

#include "header.h"
Run Code Online (Sandbox Code Playgroud)

"header.h"语法上不是字符串文字; 在字符串文字有意义之前处理它.语法类似,但是例如\t标题名称中的序列不一定被制表符替换.

换行符(这是一种空白形式)在预处理程序指令中很重要; 你不能合法写:

#ifdef
    FOO
/* ... */
#endif
Run Code Online (Sandbox Code Playgroud)

但允许除换行之外的空格:

   # if SPACES_ARE_ALLOWED_HERE
#endif
Run Code Online (Sandbox Code Playgroud)

有一种情况我可以想到预处理器令牌之间允许的空格,但它改变了含义.在类函数宏的定义中(,引入参数列表的必须紧跟宏名称.这个:

#define TWICE(x) ((x) + (x))
Run Code Online (Sandbox Code Playgroud)

定义TWICE为一个类似函数的宏,它接受一个参数.但是这个:

#define NOT_TWICE (x) ((x) + (x))
Run Code Online (Sandbox Code Playgroud)

定义NOT_TWICE为没有扩展为的参数的普通宏(x) ((x) + (x)).

此规则仅适用于宏定义 ; 宏调用遵循正常规则,因此您可以编写TWICE(42)TWICE ( 42 ).