您的位置:首页 > 其它

C陷阱与缺陷(七)可移植性缺陷

2013-03-23 16:39 281 查看
第七章 可移植性缺陷
1、应对C语言标准变更
double square(double x)
{
    return x*x;
}
旧版本

double square(x) double x;
{
    return x*x;
}

2、标识符名称的限制
某些C语言实现把标识符的所有字符都作为有效字符处理,而另一些会自动地截断尾部
ANSI C标准:C实现必须保证前6个字符不同,并且不区分大小写

3、整数的大小
short型、int型和long型
规定:
1)3种类型的整数其长度是非递减的
2)一个普通(int类型)整数足够大以容下任何数组下标
3)字符长度由硬件特性决定
short型和int型是16位,long型是32位
为了便于移植,最好的方法就是定义一个新类型
typedef long tenmil;
这样只需要改动类型的定义

4、字符是有符号整数还是无符号整数
如果是有符号,在将char类型的数扩展到int类型时,需要复制符号位
如果是无符号,只需要在多余的位上直接填充0即可
决定着一个8位字符的取值范围是从-128到127,还是从0到255
(unsigned char)c 转换为无符号整数时无需首先转换为int型整数,而是直接进行转换

5、移位运算符
1)向右移位时,空出的位是由0填充,还是符号位的副本填充
可以将操作的变量声明为无符号类型,那么空出的位都会被设置为0
2)如果被移位对象长度是n位,那么移位计数必须大于等于0,并且小于n
除法运算效率要低于移位运算

6、内存位置0
null指针并不指向任何对象。只能用于赋值或者比较运算
例:如果p或q是一个null指针,strcmp(p,q)是未定义的
C语言的不同处理:内存位置0强加了硬件级的读保护;只读;读和写,可能覆盖操作系统!

7、除法运算时发生的截断
哈希表需要保证索引为非负
h=n%HASHSIZE;
if(h<0)
    h+=HASHSIZE;

8、随机数的大小
ANSI C标准中定义了一个常数RAND_MAX,它的值等于随机数的最大取值

9、大小写转换
1)宏实现
#define _toupper(c) ((c)+'A'-'a')
#define _tolower(c) ((c)+'a'-'A')
如果字母的大小写不对,可能输出无用的垃圾信息
2)函数实现
int toupper(int c)
{
    if(c>='a'&&c<='z')
        return c+'A'-'a';
    return c;
}
会引入函数调用的开销

10、首先释放,然后重新分配
malloc函数:调用malloc(n)将返回一个指针,指向一块新分配的可以容纳n个字符的内存
free函数:把malloc返回的指针传给free函数,就释放了这块内存
realloc函数:把指向一块已分配内存的区域指针,以及这块内存新的大小作为参数传入,可以调整这块内存为新的大小,涉及到内存的拷贝

11、可移植性问题的一个例子
确保边界条件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读书笔记