《C陷阱与缺陷》第四章

《C陷阱与缺陷》第四章--连接
4.1、什么是连接器
连接器是将多个通过编译器编译后的C源程序,连接成一个载入模块
4.2、声明和定义
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
变量声明:用于向程序表明变量的类型和名字,声明不分配空间。

extern int i //声明
int i //定义

一个变量可以声明多次,只能定义一次。
在程序的一个地方使用extern int temp 声明了一个变量temp,则在其他地方必须包括它的定义。
有关声明和定义在编程时的注意事项:不要把变量定义放入.h文件,这样容易导致重复定义错误。
4.3、命名冲突与static修饰符
通过使用static修饰符修饰的变量和函数,作用域只在当前源文件。为了避免可能出现的命名冲突,只在当前作用域有用的都要设置成static。
4.4、形参,实参和返回值
如果一个函数在定义声明之前被调用,则函数默认的返回值为int

#include <stdio.h>
int main(void)
{
	//报错hello默认为返回值为int类型的值,而没有定义过这样的函数
    hello();
    return 0;
}
double hello(){
    printf("hello world");
}
#include <stdio.h>
int main(void)
{
	//不报错hello默认为返回值为int类型的值,下面的函数恰好为这种函数
    hello();
    return 0;
}
int hello(){
    printf("hello world");
}

一个函数中的形参中如果没有float,short,char类型的参数,那么在函数声明时可以省略参数类型的说明,例如:

#include <stdio.h>
//此处省略了参数类型
double square();
int main(void)
{
	printf("%lf",square(0.3));
    return 0;
}
double square(double x){
    return x*x;
}

4.5、检查外部类型
1,变量的外部参数变量与内部参数变量不一致(声明和定义的类型不同),会引起程序问题。比如:

//由于数组和指针取值方式的不同(指针为间接寻址),以下两个声明不统一会引起很大问题。
extern char *n;
char[] n;

2,外部函数的返回值和内部的函数返回值不同。由于返回值的不同,在调用时也会发生无法预测的错误。
4.6,头文件
为了避免错误,可以将声明都写在一个.h头文件中。使用这个外部变量就要包括这个头文件。

猜你喜欢

转载自blog.csdn.net/hhouxiang/article/details/80653665