1. 不要在.h文件中定义变量,可以声明一个extern全局变量,定义在某一个.c文件中进行。其他.c文件即可共用。
在源文件中引入头文件相当于直接把头文件的内容拷贝到原文件中,如果引入这个头文件后,将会在每个引入的源文件中重复定义这些变量。在C++中这样的代码是可以编译通过的,但是在C语言编译器中是不能编译通过的。
如果在头文件中定义static变量,在多个源文件中引入是可以编译通过的,因为相当于在每个源文件中定义了一个static变量,而static变量的作用域限定在这个源文件内的。
如果在头文件中定义了const变量,在多个源文件中引入是不能编译通过的,因为const没有限定作用域,每个文件都定义这个变量,会出现重复定义的错误。
不要直接在头文件中定义const或static变量,更好的写法是在源文件中定义,在头文件中extern声明。例如:
// defs.h
extern const std::string kStr;
extern const Student kStu;
// defs.cpp
const std::string kStr = "String";
const Student kStu("Name");
2. 尽量用结构体Union
3. 分时复用
4. 位域
5. 常量用const定义,会存放道flash中而不是RAM中;宏定义常量编译期间不占内存,但每次引用会分配内存。
const 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define定义的常量在内存中有若干个拷贝。
Static 与 Extern:
函数内部的定义的变量,只在函数内部存在,函数外部定义的变量分为extern 和static,extern全局变量在整个项目均可调用,static只在本文件.c/.h文件有效。
变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
静态static限定了函数或变量的存在范围为本文件,extern则表明为整个项目均存在。
static一旦定义变量,则该变量就会存在于整个文件范围内,不会消失。其真实作用域取决于定义的位置,若在函数外部,则整个文件可见可用;若定义在某一函数内部,则仅此函数文件可见可用,但在整个文件范围内存在,因此在此调用此函数,会保留上次结果;此功能仅对本函数可见,外部其他函数不可见。若无static,每次调用结束后该变量会消失。
static unsigned int temp2 = 0;/*修饰全局变量,作用域在整个a.c中*/
static void fun1(void)
{
static unsigned int temp1 = 0;
temp1++;
temp2++;
temp2++;
printf("fun1_temp = %d,temp2 = %d\r\n",temp1,temp2);
temp++;
}
static void fun2(void)
{
static unsigned int temp1 = 0;
temp2++;
printf("fun2_temp1 = %d,temp2 = %d\r\n",temp1,temp2);
}
int main(int argc, _TCHAR* argv[])
{
fun1();
fun2();
fun1();
fun2();
return 0;
}
输出结果如下:
fun1_temp = 1,temp2 = 2;
fun2_temp = 0,temp2 = 3;
fun1_temp = 2,temp2 = 5;
fun2_temp = 0,temp2 = 6;
指针:
int a = 100;
int *p_a = &a;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)