C常见问题汇总.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C常见问题汇总

1. 前言 2. 声明和初始化 2.1 我如何决定使用那种整数类型? 如果需要大数值?(大于?32,767?或小于?-32,767), 使用?long?型。否则, 如果空间很重要?(如有大数组或很多结构), 使用?short?型。除此之外, 就使用?int?型。如果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字节时避免符号扩展的问题, 请使用对应的无符号类型。但是, 要注意在表达式中混用有符号和无符号值的情况。 尽管字符类型?(尤其是无符号字符型)?可以当成?``小?整型使用, 但由于不可预知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助; 类似的问题参见问题?12.1。 在选择浮点型和双精度浮点型时也有类似的权衡。但如果一个变量的指针必须为特定的类型时, 以上规则不再适用。 如果因为某种原因你需要声明一个有严格大小的变量, 确保象?C99?的?inttypes.h?那样用某种适当的 ?typedef?封装这种选择。 通常, 这样做唯一的好原因是试图符合某种外部强加的存储方案, 请参见问题?20.3。 如果你需要操作超过?C?的内置类型支持的超大变量, 请参见问题?18.17。 2.2 64?位机上的?64?位类型是什么样的? C99?标准定义了?long long?类型, 其长度可以保证至少?64?位, 这种类型在某些编译器上实现已经颇有时日了。其它的编译器则实现了类似 ?__longlong?的扩展。 另一方面, 也可以实现?16?位的短整型、 32?位的整型和?64?位的长整型, 有些编译器正是这样做的。 2.3 怎样定义和声明全局变量和函数最好? 首先, 尽管一个全局变量或函数可以?(在多个编译单元中)?有多处?``声明, 但是?``定义?却只能允许出现一次。定义是分配空间并赋初值?(如果有)?的声明。最好的安排是在某个相关的?.c?文件中定义, 然后在头文件 ?(.h)?中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的?.c?文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。 这条规则提供了高度的可移植性: 它和?ANSI C?标准一致, 同时也兼容大多数 ?ANSI?前的编译器和连接器。Unix?编译器和连接器通常使用?``通用模式 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C?标准称这种行为为?``公共扩展, 没有语带双关的意思。 可以使用预处理技巧来使类似 DEFINE(int, i); 的语句在一个头文件中只出现一次, 然后根据某个宏的设定在需要的时候转化成定义或声明。但不清楚这样的麻烦是否值得。 如果希望让编译器检查声明的一致性, 一定要把全局声明放到头文件中。特别是, 永远不要把外部函数的原型放到?.c?文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型比不用还糟糕。 2.4 extern?在函数声明中是什么意思? 它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中, 但在 extern int f(); 和 int f(); 之间并没有实质的区别。 2.5 关键字?auto?到底有什么用途? 毫无用途;它已经过时。 2.6 我似乎不能成功定义一个链表。我试过 ?typedef struct { char *item; NODEPTR next; } *NODEPTR;?但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗? C?语言中的结构当然可以包含指向自己的指针; [KR2, 第?6.5?节] 的讨论和例子表明了这点。?NODEPTR?例子的问题是在声明?next?域的时候 ?typedef?还没有定义。为了解决这个问题, 首先赋予这个结构一个标签 ?(``struct node)。然后, 声明?``next?域为 ?``struct node *, 或者分开?typedef?定义和结构定义, 或者两者都采纳。以下是一个修改后的版本: struct node { char *item; struct node *next; }; typedef struct node *NODEPTR; 至少还有三种同样正确的方法解决这个问题。 在用?typedef?定义互相引用的两个结构时也会产生类似的问题, 可以用同样的方法解决。 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含?N?个指向返回指向字符的指针的函数的指针的数组? 这个问题至少有以下?3?种答案: char *(*(*a[N])())(); 用?typedef?逐步完成声明: typedef char

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档