C 语言常见误解

维基教科书,自由的教学读本

前言[编辑]

许多写 C 的人了解很多实作(编译器、机器和操作系统)的细节,误把特定实作当成 C 语言标准的一部分,写出许多不可携(non-portable)的程式码而不自知。可携程式码不会因为开最佳化选项而产生错误,也能一字不动的从 32 位元系统移植至 64 位元系统上(或是稍早之前,从 16 位元系统移植至 32 位元系统),跨越所有符合标准的实作。不一定要换电脑或改用嵌入式系统才算换实作;只要换编译器或是改变参数,都算一个新的实作。

这本书企图列出写 C 语言一段时间后还是很难知道的陷阱。除了标准文件的考证外,也尽量举出实际上会发生错误的实作(机器型号、编译器用的参数等等),以免沦为理论空谈。改编成 Wikibook 格式前,问题清单主要从台湾 BBS 站 PTT 的 C/C++ 版实地考察搜集而成。除标准委员会公布的文件外,主要考证依据还包括 comp.std.c 讨论区。本书并不反对程序员查阅实作的文件,相反的鼓励大家查阅各种标准;本书反对的是误把特定实作细节当作 C 语言标准。

这本书并不是给初学者读的,而是针对有经验的 C 程序员而写,因此不会有初学才有的问题。有兴趣的人可下载 C 标准 官方草稿 N1256 搭配问答一起看,其中 2.3p4 代表 2.3 第 4 段;本书语言标准的超链接全连往非官方 N1256 网页版本

改编成 Wikibook 格式前,本篇文章收录误解问答的准则与精神如下:

  • 可携性为最高原则。“误解”代表写出不可携的程式码而不自知。特定平台上不可携的程式码可能有明确的定义,但不在讨论范围内。
  • 本文认为“以为某语法正确”比“以为某语法错误”严重,因此
    • 不提保证可携的炫技写法。
    • 介绍安全写法时,以实务上好记好理解为原则。当规则过于复杂时,宁可介绍更保守但保证安全的简单作法。
  • 只收录长年写 C 的人可能有的误解,不收录初学 C 时才容易犯的错误。
  • 不收录 C++ 为主的问答(因为文章已经太长了),不过可以适时提 C++ 的状况。
  • 优先收录编译器不用发出任何警告,而且有真实例子的误解。

现在改编成 Wikibook 格式,希望能借由大家参与,让原文章变得更有用。有发现什么错误或遗漏的地方吗?请动手改吧!