下一节: , 上一节: , 上级: 编写 C 代码   [目录][索引]


5.3 C 构造的清晰使用

请显式声明所有对象的类型。例如,您应该显式声明函数的所有参数,并且应该声明函数返回 int,而不是省略 int

一些程序员喜欢使用 GCC 的 ‘-Wall’ 选项,并在发出警告时更改代码。如果您想这样做,那就这样做。其他程序员不喜欢使用 ‘-Wall’,因为它会为他们不想更改的有效且合法的代码发出警告。如果您想这样做,那就这样做。编译器应该是您的仆人,而不是您的主人。

不要仅仅为了安抚像 lintclang 和 GCC 这样的静态分析工具,以及像 -Wconversion-Wundef 这样的额外警告选项,而让程序变得难看。这些工具可以帮助查找错误和不清晰的代码,但它们也可能产生如此多的误报,以至于使用不必要的类型转换、包装器和其他复杂操作来消除它们会损害可读性。例如,请不要仅仅为了安抚 lint 检查器而插入到 void 的类型转换或调用无操作函数。

外部函数和稍后出现在源文件中的函数的声明都应该放在文件开头的某个位置(在文件中的第一个函数定义之前),或者放在头文件中。不要将 extern 声明放在函数内部。

以前的常见做法是在一个函数中重复使用相同的局部变量(名称如 tem)来表示不同的值。与其这样做,不如为每个不同的目的声明一个单独的局部变量,并给它一个有意义的名称。这不仅使程序更容易理解,而且还有利于优秀编译器的优化。您还可以将每个局部变量的声明移动到包含其所有使用的最小作用域中。这使程序更加简洁。

不要使用遮蔽全局标识符的局部变量或参数。GCC 的 ‘-Wshadow’ 选项可以检测到这个问题。

不要在一个跨行的声明中声明多个变量。而是在每一行开始一个新的声明。例如,不要这样写

int    foo,
       bar;

写成这样

int foo, bar;

或者这样

int foo;
int bar;

(如果它们是全局变量,那么每个变量都应该在前面加上注释。)

当您在另一个 if 语句中嵌套 if-else 语句时,请始终在 if-else 周围加上大括号。因此,永远不要这样写

if (foo)
  if (bar)
    win ();
  else
    lose ();

总是这样写

if (foo)
  {
    if (bar)
      win ();
    else
      lose ();
  }

如果您有一个 if 语句嵌套在 else 语句中,请在同一行中编写 else if,如下所示

if (foo)
  …
else if (bar)
  …

它的 then 部分与前面的 then 部分缩进相同,或者将嵌套的 if 放在大括号内,如下所示

if (foo)
  …
else
  {
    if (bar)
      …
  }

不要在同一声明中声明结构标记和变量或 typedef。而是单独声明结构标记,然后使用它来声明变量或 typedef。

尽量避免在 if 条件内部进行赋值(在 while 条件内部赋值是可以的)。例如,不要这样写

if ((foo = (char *) malloc (sizeof *foo)) == NULL)
  fatal ("virtual memory exhausted");

而是这样写

foo = (char *) malloc (sizeof *foo);
if (foo == NULL)
  fatal ("virtual memory exhausted");

下一节: , 上一节: , 上级: 编写 C 代码   [目录][索引]