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、可移植性问题的一个例子
确保边界条件
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、可移植性问题的一个例子
确保边界条件
相关文章推荐
- c缺陷与陷阱笔记-第七章 可移植性代码
- 《C陷阱与缺陷》学习笔记总结:词法陷阱、语法陷阱、语义陷阱,连接、库函数、预处理器、可移植性缺陷及其他
- 【C陷阱和缺陷】可移植性缺陷
- 【C陷阱和缺陷】可移植性缺陷
- c陷阱和缺陷——链接、预处理、库函数、可移植性缺陷
- C陷阱与缺陷(四)--声明与定义
- C与指针、C陷阱与缺陷
- 读书笔记--C陷阱与缺陷(七)
- 程序员老司机都要错的 Python 陷阱与缺陷列表
- C陷阱与缺陷(二)语法"陷阱"
- C陷阱与缺陷(四)
- C陷阱与缺陷(C Traps and Pitfalls)--学习笔记--第一章:词法陷阱
- C语言:陷阱和缺陷
- C语言缺陷与陷阱(笔记)
- C++ 静态变量或成员初始化陷阱与缺陷
- C语言:陷阱和缺陷
- 《Java解惑》陷阱和缺陷的目录
- 看C陷阱与缺陷的一点收获
- C陷阱与缺陷(小结1)
- C语言陷阱和缺陷