c - 什么时候不允许使用空格来提高可读性?

标签 c coding-style whitespace

C 在空格方面似乎相当宽容。

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

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

#include < stdio.h > // fatal error:  stdio.h : No such file or directory

C 语言中还有哪些上下文不能使用空格来提高可读性?

最佳答案

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

异常(exception)情况涉及预处理器。

您已经提到了#include 指令。注意给定:

#include "header.h"

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

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

#ifdef
    FOO
/* ... */
#endif

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

   # if SPACES_ARE_ALLOWED_HERE
#endif

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

#define TWICE(x) ((x) + (x))

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

#define NOT_TWICE (x) ((x) + (x))

NOT_TWICE 定义为不带参数的普通宏,扩展为 (x) ((x) + (x))

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

关于c - 什么时候不允许使用空格来提高可读性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27334006/

相关文章:

c++ - 命名空间 'vsnprintf' 中没有名为 'std' 的成员;你是说 'vsprintf' 吗?

c - 我们如何释放携带指向某个位置的指针的节点内存

c++ - 未知容器大小

c# - 在 MonoTouch 中的 View Controller (缓存数据)之间传递数据的最佳方式

C 字符串。未获得所需的输出。我怎样才能输入这样的数字

html - 为什么我的 inline-block 后面有空格?

css - 如何确保只能选择想要的文本?

c - 解析C语言中变量参数函数调用的Json字符串

c - 将结构数组嵌套到另一个结构中

python - 巧妙缩进 SQL 语句的算法(Python 实现会很好)