c陷阱和缺陷——链接、预处理、库函数、可移植性缺陷

来源:互联网 发布:linux更改文件权限例子 编辑:程序博客网 时间:2024/05/17 07:24

1.链接

1.命名冲突和static修饰符:
如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象都在同一个源文件中以static修饰。static同时也适合函数,如果函数g被函数h调用,则将函数g和h放到同一个文件中,并且申明g是static。

2.库函数

1.一个看似正确的程序:
#include <iostream>using namespace std;int main(){char c;while ((c=getchar())!=EOF){putchar(c);}return 0;}
这个程序意思很明白:输入字符不是结束符就把它放到c里。但实际上却会因为可能char类型的c无法装载EOF整个数据,或者是数据中间部分可能被截断而出现错误。

3.预处理器

1.宏空格
#define f (x) ((x)-1)
则应该表达为:f是(x)((x)-1)
2.#define abs(x) x>0?x:-x;
本来这个宏定义是求绝对值,但是abs(a-b)会被展开成a-b>0?a-b:-a-b,这个并不是我们要的结果,所以,应该把x打上括号,就是#define abs(x)  (((x)>0)?(x):-(x));
3.在宏定义时确保参数没有副作用,或者直接用函数代替宏定义就可以。
4.宏定义不是类型定义:
#define T1 struct  foo*   T1 a,b; 则被翻译为:struct foo* a,b;
typedef struct foo *T2; T2 a,b;则被翻译为: struct foo *a,*b;

4.可移植性缺陷

1.有符号的奇数进行右移位运算时并不是简单的除以2,且结果也并不等于除以2;

0 0