c语言符号定义、声明、引用、作用域及生命期、优化
2017-05-23 20:28
330 查看
1、变量
全局变量:不用考虑初始化问题,若未被初始化,则编译器自动设置为0;
局部变量:存储在内存的堆栈中,若未被初始化则使用其占用内存空间原有的值,这个值是个随机值,不初始化直接引用很危险。
2、定义及声明
一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。打一个粗俗的比方:在源文件A中定义,在源文件B中声明,好比在B里开了一扇窗,让它可以看到A里的那个函数。
声明表示告诉编译器该变量的存在,但是不为该变量分配存储空间(int a;);而在定义变量时不仅告诉编译器该变量存在,而且为该变量赋值,由于赋值了,所以变量的存储空间就被分配了(int a=1;)。
当变量的作用域范围内只有声明,没有定义时,编译器会自动将第1个声明当作是变量的定义。例如:
int f(int a)
{
int b;//找不到对变量b的定义,因此该处声明被认为是变量的定义;分配4个字节的存储空间给变量b
b=2;//这里是对变量b赋值,不是定义
return a+b;
}
C语言中的符号解析规则:
1)、不允许有多个符号(变量或函数)的定义;
2)、如果有一个符号的定义和多个符号的声明,则选择被定义的符号;
3)、如果有多个符号的声明,则从中任选一个作为符号的定义;
3、引用
如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
如果不想包含头文件,那么需要在其他c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件。
4、作用域及生命期
全局变量:定义在函数外部,生命期整个程序;
局部变量:定义局部变量的函数或复合语句内,调用结束后生命期就结束;
static 全局变量:生命期不变(整个程序执行过程一直存在),作用域减小(只在本文件函数中可以引用);
static 局部变量:生命期增加(整个程序执行过程一直存在),作用域不变;
5、函数有关优化
1)访问内存在计算机的操作中很消耗时间,而每次调用函数都需要大量的时间来访问内存,因此在程序的执行过程中尽量减少函数调用,将运行结果相同的函数合并;
2)全局变量存储在数据段上也就是存储在内存中,局部变量存储在堆栈上。对于在程序中调用频率高的局部变量,编译器会自动将其存储在寄存器,但是全局变量不会存储在寄存器中,全局变量在整个程序执行过程中一直存在,那么在整个程序执行过程中,该寄存器都将无法存储临时变量或中间值,这对于寄存器资源稀少的计算机是不可接受的,程序运行效率会大打折扣。而访问内存的时间要远远大于cpu的计算时间,因此要较少内存访问,不要将使用频率高的变量设置为全局变量。
全局变量:不用考虑初始化问题,若未被初始化,则编译器自动设置为0;
局部变量:存储在内存的堆栈中,若未被初始化则使用其占用内存空间原有的值,这个值是个随机值,不初始化直接引用很危险。
2、定义及声明
一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。打一个粗俗的比方:在源文件A中定义,在源文件B中声明,好比在B里开了一扇窗,让它可以看到A里的那个函数。
声明表示告诉编译器该变量的存在,但是不为该变量分配存储空间(int a;);而在定义变量时不仅告诉编译器该变量存在,而且为该变量赋值,由于赋值了,所以变量的存储空间就被分配了(int a=1;)。
当变量的作用域范围内只有声明,没有定义时,编译器会自动将第1个声明当作是变量的定义。例如:
int f(int a)
{
int b;//找不到对变量b的定义,因此该处声明被认为是变量的定义;分配4个字节的存储空间给变量b
b=2;//这里是对变量b赋值,不是定义
return a+b;
}
C语言中的符号解析规则:
1)、不允许有多个符号(变量或函数)的定义;
2)、如果有一个符号的定义和多个符号的声明,则选择被定义的符号;
3)、如果有多个符号的声明,则从中任选一个作为符号的定义;
3、引用
如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
如果不想包含头文件,那么需要在其他c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件。
4、作用域及生命期
全局变量:定义在函数外部,生命期整个程序;
局部变量:定义局部变量的函数或复合语句内,调用结束后生命期就结束;
static 全局变量:生命期不变(整个程序执行过程一直存在),作用域减小(只在本文件函数中可以引用);
static 局部变量:生命期增加(整个程序执行过程一直存在),作用域不变;
5、函数有关优化
1)访问内存在计算机的操作中很消耗时间,而每次调用函数都需要大量的时间来访问内存,因此在程序的执行过程中尽量减少函数调用,将运行结果相同的函数合并;
2)全局变量存储在数据段上也就是存储在内存中,局部变量存储在堆栈上。对于在程序中调用频率高的局部变量,编译器会自动将其存储在寄存器,但是全局变量不会存储在寄存器中,全局变量在整个程序执行过程中一直存在,那么在整个程序执行过程中,该寄存器都将无法存储临时变量或中间值,这对于寄存器资源稀少的计算机是不可接受的,程序运行效率会大打折扣。而访问内存的时间要远远大于cpu的计算时间,因此要较少内存访问,不要将使用频率高的变量设置为全局变量。
相关文章推荐
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间
- C语言——符号的声明与定义
- C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间
- C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++声明、定义、类的定义、头文件作用、头文件重复引用
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- c++高级---C++声明、定义、类的定义、头文件作用、头文件重复引用,不具名空间以及编译器编译链接过程
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C语言中变量定义与声明的区别
- C语言 全局变量定义与声明
- C语言之头文件预定义宏的作用
- c语言中定义struct型变量时使用“.”符号的意义
- c语言的符号和引用问题数据结构C语言 ->含义是