变量的作用域
作用域分成: 代码块作用域,文件作用域,原型作用域,函数作用域。
代码块作用域: { }里面的称为代码块,凡是在 代码块开始位置声明的变量都 具有代码块作用域,即可以在{ }里面访问。
文件作用域: 声明于花括号外面的 变量都具有文件作用域。即在该文件内可以访问。
原型作用域: 是指那些函数原型中的声明。基本没啥施展的地方。
函数作用域: goto语句才有,希望永远不要用
这样看主要是理解: 代码块内核代码块外的区别。
链接属性
当各个源文件被分别编译后,怎么才能访问调用别的文件里面的变量?
链接属性共有三种:
分类 |
默认 |
用途 |
External |
代码块外的变量和函数,均默认具有external属性 |
可以被其他文件引用 |
Internal |
除非特别指定,默认不存在internal属性 |
使用static强制变为内部变量 |
None |
除了代码块{}外,其余所有的都默认是none属性 |
-- |
External链接属性,是允许其他文件引用的,但是在使用前需要声明。而且要特别声明为 extern int a
这是因为,源文件编译的时候,是一个一个文件检查语法的,如果使用前不声明,就会报语法错误
特别声明为extern 类型,我理解是为了 明确告知程序员,这个变量的源在其他文件内。
这里指出,函数不需要声明,也不要特别声明extern ,可以拿过来直接调用。(这个原因我还没理解。。。)
None属性: 默认情况下,代码块内的东西属于none属性。不过没啥意义
Internal属性: 在代码块外声明时,可以加上关键字 static,就会把 原本默认external属性的变量、函数强制变为internal。
仅供该文件内部使用。
存储类型
变量有三个存储位置: RAM、堆栈、register
分类 |
变量源 |
|
RAM |
代码块外声明的变量都默认会存储在RAM,时钟保持。 |
不管前缀不缀static |
堆栈 |
代码块内声明的变量默认会存储在堆栈中,随用随销毁 |
变量前缀static, 会把存储为变更到RAM中去 |
Register |
需要特别指定,才会存在register |
补充:
函数原型 & 函数原型声明 & 函数定义
在早期C语言中 ,调用函数之前, 需要声明函数名字、返回值信息,如 double sqrt(); 但是呢不声明参数列表。这样在实际使用中可能会 sqrt(10), sqrt(1.4,9)
我们希望能规范的调用函数,当参数列表出现异常时,能警示我们。故而现代C中,函数原型声明,需要 返回值、函数名、参数列表类型声明。这样编译器在后续碰到调用情况时,
会自动的去判断 传参列表是否对应。 以上称之为 函数原型、及其声明。
函数定义: 函数定义是指,实现函数body。 如 int sqrt ( int i) { return I * I }