1. 变量
在添加变量之前,我们先解释一下声明和定义两个概念。 声明变量意味着向编译器描述变量的类型,但不为变量分配存储空间。 定义变量就是声明变量并为变量分配存储空间。 定义变量时,还可以对变量进行初始化。
局部变量通常只定义而不声明,而全局变量大多在源文件中定义并在头文件中声明。
局部变量
函数内部定义的变量是内部变量,仅在该函数的作用域内有效。
自动变量自动
函数中局部变量的默认格式是自动变量类型。 例如,int b,c=3; 和自动整型b,c=3; 在函数体内是等价的。
自动变量动态分配存储空间,并在函数结束后释放。 如果自动变量没有分配初始值,则其值为不确定值。
静态局部变量
静态局部变量是指在函数体中声明和定义的局部变量。 它们仅供本函数使用,即其他函数不能调用它。 静态局部变量的值在函数调用结束后并不会消失而是保留原来的值,即它所占用的存储单元没有被释放。 当进行下一个函数调用时,变量已经有了一个值,该值是上一个函数调用结束时的值。
静态局部变量在静态存储区域中分配存储单元,并且在程序的整个运行期间不会被释放。 静态局部变量在编译时被赋予初始值,即初始值只被赋予一次。
在SDT编译器中,建议给静态局部变量赋一个初始值,否则静态局部变量的初始值将是一个不确定的值。 在其他编译器中,未初始化的静态局部变量的初始值可能为零。 这是由具体的编译器决定的。 使用前最好先测试一下。
寄存器变量
带修饰符的变量向编译器暗示(只是提示,而不是命令)该变量将被频繁使用,并且如果可能,应将其保存在 CPU 寄存器中以加快其访问速度。
对于大多数现有的编译器来说,最好不要使用修饰符。 因为它对早期低效的 C 编译器来说是一个有价值的补充。 随着编译器技术的改进,在决定哪些变量应存储在寄存器中时,C 编译器现在可以比程序员做出更好的决策。
全局变量
在函数外部定义的变量称为外部变量。 外部变量是全局变量,可以被该文件中的其他函数共享。 全局变量都是静态存储方式,在编译时分配内存,但作用域不同。
静态外部变量
静态外部变量只能在该文件内使用。 因此静态外部变量应该在当前源文件中声明和定义。
外部变量
在函数中定义全局变量时,其默认格式为外部变量类型。 外部变量应在头文件中声明并在当前源文件中定义。 外部变量允许从其他文件引用。
下面的示例声明一个变量和一个结构体,并定义两个变量,其中之一被初始化:
int 声明1; // 这是一个
声明2
整数;
}; // 这只是类型 – 不
int def1 = 8; // 这是一个
int def2; // 这是一个
2. 功能
内部函数的声明和定义大部分在当前源文件中完成; 而外部函数通常在源文件中定义并在头文件中声明。
内部功能
仅在当前源文件中使用的函数应声明为内部函数。 内部函数应在当前源文件中声明和定义。 如果在头文件中声明了内部函数,其他源文件也可以通过包含该头文件来使用该函数,但这将失去其作为内部函数的意义。
优点:使用内部函数可以将函数限制在其所在文件内。 这可以避免与其他源文件中可能出现的同名函数发生冲突。
例子:
文件:.c
# “。H”
int(无效);
无效(无效)
……
rc = ( );
……
整数(无效)
……
RC;
外部函数
可以在当前源文件外部使用的函数应在头文件中声明。 其他源文件可以通过包含此头文件或声明它们(推荐前者)来使用这些函数。
一个好的编程习惯是在头文件中声明函数原型。 这可以方便编译器错误检查。 定义函数时,默认函数类型为外部函数。 例如:void fun2(void); 和 void fun2(void); 具有等效的函数类型,但前者定义一个函数,后者声明一个函数。
概括
在编写程序时,尤其是大型程序时,建议使用上面提到的方法对不同的变量和函数进行必要的声明和定义。 做好这些细节可以给你的编程、调试、移植等带来很大的方便。