20100601 c陷阱与指针读书笔记(第四五六章)
这三章主要讲了C语言的链接、库函数、预处理。还是有点晦涩难懂啊。
一个C程序是可以有多个部分组成的,但是编译器每次只能编译一个文件,找出其中的错误。某些C语言实现提供了一个称为lint的程序,可以捕获大量的此类错误。连接器一般是与编译器分离的,编译器是把C程序“翻译”成对连接器有意思的形式,这样连接器就能“读懂”C程序了。
对于同名引起的冲突,我们可以将这些放到一个源文件中,并用static修饰,用于若干函数共享这些数据。还有一个好方法就是每个外部对象只在一个地方声明,这个声明的地方一般就在一个头文件中,需要用到该外部对象的所有模块都应该包括这个头文件。
C语言中默认的函数类型为int。任何函数都应该在第一次被调用之前进行声明或者定义,若不这样,函数的默认类型就为int了。函数声明时,形参除了float,short,char类型的参数,在函数声明中完全可以省略参数的类型说名。
宏定义#define,预处理命令,在编译之前完成,可以简化我们的代码。有时候看上去像个函数,却没有函数的开销。宏提供了对字符的替换功能,却不使用对象。
宏的使用是:#define 宏名 替换内容 其中的空格需要注意。不然会引起错误。在使用宏的时候,如果有对参数的操作,不能重复多次(例如++,——),每一次替换都会使操作重复一次,从而带来错误。确保宏没有错误,应该注意使用括号。
一定要注意的是,宏只是替换!!
相关文档:
关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:
#define WARN_IF(EXP) \
do{ if (EXP) \
& ......
#include<stdio.h>
#define N 8
void input(int n,int p[N][N])
{
int i,j;
for(i=0;i<n;i++)
{
printf("please input the %d line:\n",i+1);
for(j=0;j<n;j++)
{
scanf("%d",&p[i][j]);
}
}
}
void output(int n,int p[N][N])
......
1) goto
goto 只能在一个函数内跳转。建议少用,使得程序维护起来容易出错;但是,在有多个循环情况下跳转,有时用goto可以使得问题变得简单。
class A
{
public:
A(){}
~A(){}
};
&nbs ......
C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。
由于 ......