大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C技巧 > 必须弄懂的495个C语言问题

必须弄懂的495个C语言问题(1)

关键词:弄懂语言  阅读(1701) 赞(17)

[摘要]本文是对必须弄懂的495个C语言问题的讲解,与大家分享。

1.1 我如何决定使用那种整数类型?
如果需要大数值(大于32, 767 或小于¡32, 767), 使用long 型。否则, 如果空间很重要(如有大数组或很多结构), 使用short 型。除此之外, 就使用int 型。如果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字节时避免符号扩展的问题, 请使用对应的无符号类型。但是, 要注意在表达式中混用有符号和无符号值的情况。


尽管字符类型(尤其是无符号字符型) 可以当成“小” 整型使用, 但由于不可预知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助;类似的问题参见问题12.1。


在选择浮点型和双精度浮点型时也有类似的权衡。但如果一个变量的指针必须为特定的类型时, 以上规则不再适用。


如果因为某种原因你需要声明一个有严格大小的变量, 确保象C99 的<inttypes.h> 那样用某种适当的typedef 封装这种选择。通常, 这样做唯一的好原因是试图符合某种外部强加的存储方案, 请参见问题20.3。


如果你需要操作超过C 的内置类型支持的超大变量, 请参见问题18.17。


参考资料: [K&R1, Sec. 2.2 p. 34]; [K&R2, Sec. 2.2 p. 36, Sec. A4.2 pp.195-6, Sec. B11 p. 257]; [ISO, Sec. 5.2.4.2.1, Sec. 6.1.2.5]; [H&S, Secs. 5.1,5.2 pp.110-114]。


1.2 64 位机上的64 位类型是什么样的?

C99 标准定义了long long 类型, 其长度可以保证至少64 位, 这种类型在某些编译器上实现已经颇有时日了。其它的编译器则实现了类似longlong 的扩展。另一方面, 也可以实现16 位的短整型、32 位的整型和64 位的长整型, 有些编译器正是这样做的。

参见问题18.17。


参考资料: [C9X, Sec. 5.2.4.2.1, Sec. 6.1.2.5]


1.3 怎样定义和声明全局变量和函数最好?


首先, 尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次。定义是分配空间并赋初值(如果有) 的声明。最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。


这条规则提供了高度的可移植性: 它和ANSI C 标准一致, 同时也兼容大多数ANSI 前的编译器和连接器。Unix 编译器和连接器通常使用“通用模式” 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为为“公共扩展”, 没有语带双关的意思。


可以使用预处理技巧来使类似DEFINE(int, i);的语句在一个头文件中只出现一次, 然后根据某个宏的设定在需要的时候转化成定义或声明。但不清楚这样的麻烦是否值得。


如果希望让编译器检查声明的一致性, 一定要把全局声明放到头文件中。特别是, 永远不要把外部函数的原型放到.c 文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型比不用还糟糕。


参见问题10.4 和18.6。


参考资料: [K&R1, Sec. 4.5 pp. 76-7]; [K&R2, Sec. 4.4 pp. 80-1]; [ISO, Sec.6.1.2.2, Sec. 6.7, Sec. 6.7.2, Sec. G.5.11]; [Rationale, Sec. 3.1.2.2]; [H&S, Sec. 4.8pp. 101-104, Sec. 9.2.3 p. 267]; [CT&P, Sec. 4.2 pp. 54-56].


1.4 extern 在函数声明中是什么意思?

«上一页123下一页»


相关评论