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中的其他上下文是什么,其中空格不能用于可读性?
在大多数情况下,在单个令牌中添加空格会使程序无效或更改令牌的含义.一个明显的例子:"foo"并且" foo "都是具有不同值的有效字符串文字,因为字符串文字是单个标记.更改123456为123 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 ).