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

时间:2014-12-06 16:51:34

标签: c coding-style whitespace

当谈到空白时,C似乎非常宽容。

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

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

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

C中的其他上下文中哪些空格不能用于可读性?

3 个答案:

答案 0 :(得分:5)

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

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

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

#include "header.h"

"header.h"在语法上不是字符串文字;在字符串文字有意义之前处理它。语法类似,但是例如标题名称中的\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 )

答案 1 :(得分:2)

在词法令牌中,不允许使用空格以提高可读性(重要性)。即在一个标识符(foo barfoobar)之内,在一个数字(123 456不同于123456)内,在一个字符串中(这是你的例子基本上) )或在运算符内(+ +++不同,+ =+=不同。在那些之间你可以添加尽可能多的空白区域,但是当你在这样的标记内添加空格时,你会将词法标记分成两个单独的标记(或者在字符串常量的情况下改变值),从而改变其含义你的代码。

在大多数情况下,添加了空格的代码要么与原始代码等效,要么会导致语法错误。但也有例外。例如:

return a +++ b;

相同
return a ++ + b;

但不同于:

return a + ++ b;

答案 2 :(得分:0)

我记得你需要对类似函数的宏非常小心,就像在这样的虚拟例子中一样:

#include <stdio.h>

#define sum(x, y) ((x)+(y))

int main(void)
{
    printf("%d\n", sum(2, 2));

    return 0;
}

#define sum(x, y) ((x)+(y))

与说法不同:

#define sum (x, y) ((x)+(y))

后一个是类似对象的宏,它完全取代(x, y) ((x)+(y)),即参数不被取代(因为它发生在类似函数的宏中)。