- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c语言中常出现问题详解[精]
C语言中.h的意思与用途
作为一般规则, 你应该把这些东西放入头(.h)文件中:2 宏定义(预处理#defines)2 结构、联合和枚举声明2 typedef声明2 外部函数声明(参见问题1.4)2 全局变量声明当声明或定义需要在多个文件中共享时, 尤其需要把它们放入头文件中。特别是, 永远不要把外部函数原型放到.c 文件中。参见问题1.3。另一方面, 如果定义或声明为一个.c 文件私有, 则最好留在.c 文件中。参见问题1.3和10.5。参考资料: [KR2, Sec. 4.5 pp. 81-2]; [HS, Sec. 9.2.3 p. 267]; [CTP, Sec.
一个头文件可以包含另一头文件吗?这是个风格问题, 因此有不少的争论。很多人认为“嵌套包含文件”应该避免:盛名远播的“印第安山风格指南”(Indian Hill Style Guide,参见问题17.7)对此嗤之以鼻; 它让相关定义更难找到; 如果一个文件被包含了两次, 它会导致重复定义错误; 同时他会令makefile的人工维护十分困难。另一方面, 它使模块化使用头文件成为一种可能(一个头文件可以包含它所需要的一切, 而不是让每个源文件都包含需要的头文件);类似grep的工具(或tags文件)使搜索定义十分容易, 无论它在哪里; 一种流行的头文件定义技巧是:#ifndef HFILENAME_USED#define HFILENAME_USED... 头文件内容...#endif每一个头文件都使用了一个独一无二的宏名。这令头文件可自我识别,以便可以安全的多次包含; 而自动Makefile维护工具(无论如何, 在大型项目中都是必不可少的)可以很容易的处理嵌套包含文件的依赖问题。参见问题17.8
我如何用#if表达式来判断机器是高字节在前还是低字节在前?恐怕你不能。(预处理运算仅仅使用长整型, 而且没有寻址的概念。)你是否真的需要明确知道机器的字节顺序呢?通常写出与字节顺序无关的代码更好。为什么声明extern int f(struct x *p); 报出了一个奇怪的警告信息“结构x在参数列表中声明”?与C语言通常的作用范围规则大相径庭的是, 在原型中第一次声明(甚至提到)的结构不能和同一源文件中的其它结构兼容, 它在原型的结束出就超出了作用范围。要解决这个问题, 在同一源文件的原型之前放上这样的声明:struct x;它在文件范围内提供了一个不完整的结构x的声明, 这样, 后续的用到结构x的声明至少能够确定它们引用的是同一个结构x。11.23 a[3] =abc; 合法吗?它是什么意思?尽管只在极其有限的环境下有用, 可它在ANSI C (可能也包括一些ANSI之前的系统)中是合法的。它声明了一个长度为3的数组, 把它的三个字符初始化为’a’, ’b’ 和’c’, 但却没有通常的’\0’字符。因此该数组并不是一个真正的C字符串从而不能用在strcpy, printf %s等当中。多数时候, 你应该让编译器计算数组初始化的初始值个数, 在初始值“abc”中,计算得长度当然应该是4。参考资料: [ISO, Sec. 6.5.7
为什么这些代码double d; scanf(%f, d); 不行?跟printf()不同, scanf() 用%lf代表双精度数, 用%f代表浮点数。
怎样在scanf()格式串中指定可变的宽度?不能: scanf() 格式串中的星号表示禁止赋值。你可以使用ANSI的字符串化和字符连接完成同样的事情, 或者你可以在运行时创建scanf格式串。12.15 当我用“%d\n”调用scanf从键盘读取数字的时候, 好像要多输入一行函数才返回。可能令人吃惊, nn在scanf格式串中不表示等待换行符, 而是读取并放弃所有的空白字符。参见问题12.18。参考资料: [KR2, Sec. B1.3 pp. 我用scanf %d读取一个数字, 然后再用gets()读取字符串, 但是编译器好像跳过了gets()调用!scanf %d不处理结尾的换行符。如果输入的数字后边紧接着一个换行符, 则换行符会被gets()处理。作为一个一般规则, 你不能混用scanf()和gets(),或任何其它的输入例程的调用; scanf对换行符的特殊处理几乎一定会带来问题。要么就用scanf()处理所有的输入, 要么干脆不用。
数组和下标在C语言中可以互换。这个奇怪的事实来自数组下标的指针定义, 即对于任何两个表达式a和e,只要其中一个是指针表达式而另一个为整数, 则a[e]和*((a)+(e))完全一样。这种交换性在许多C语言的书中被看作值得骄傲的东西
文档评论(0)