C语言中变量和函数的做用域和连接属性

C语言中变量和函数的做用域和连接属性

做用域

  1. 代码块做用域: 代码块指的是使用“{}”包围起来的部分。
    1. 在代码块中定义的变量,代码块以外是不能访问的。
    2. 代码块嵌套以后的变量做用域,子代码块中定义的同名变量会覆盖父代码块中的同名变量。
    3. #include <stdio.h>
       int main(){
           {
               int i=0;
               printf("%d\n",i);//0
               {                   
                   int i=1;
                   printf("%d\n",i);//1
               }
           }
       }
  2. 函数原型做用域: 函数原型做用域仅包括函数原型形式参数所在的括号。该做用于主要强调声明函数时不能使用相同名称的形式参数。
  3. 函数做用域: 函数做用域指的就是函数体的部分。K&R C的函数体不包含函数参数,因此在函数体内定义和函数参数同名变量会替代函数参数。ANSI C修改了该问题,函数参数在函数体的最外层做用域以内。
    1. 函数做用域内定义的变量,在函数以外不能进行访问。
  4. 文件做用域: 源文件所在的范围。
    1. 全部代码块以外定义的标识符就有文件做用域。(全局变量)
    2. 函数名不属于任何任何代码块,所以也具备文件做用域。

连接属性

  • 当组成一个程序的全部源文件被编译以后,全部目标文件以及那些从一个或多个函数库中引用的函数连接在一块儿,组成可执行文件。问题是当相同的标识符出如今不一样的源文件时该怎么办?标识符的连接属性用来处理不一样源文件中出现的标识符。标识符的连接属性和它的做用域有关但并不相同。
  1. none(无): 老是被当作单独个体,也就是说该标识符在不一样源文件中的屡次声明之间毫无关系,分属不一样的实体。
    1. 代码块以内定义的变量默认具备none链接属性。经过extern修饰符能够修改成外部连接属性,这样就能够访问其余源文件中定义的外部变量了。static修饰符不能修改链接属性和做用域,只修改存储类型。
      C #include <stdio.h> int main(){ { static int i=0; printf("%d\n",i);//0 } printf("%d\n",i);//error: ‘i’ undeclared (first use in this function) }
  2. internal(内部): 在同一个源文件中的全部声明指向同一实体,不一样源文件指向不一样实体。全局变量和函数能够经过static修饰符从外部连接属性改成内部连接属性。
  3. external(外部):在全部源文件中指向同一实体。全局变量和函数默认具备全局做用域,能够经过extern将从未显式声明连接属性的标识符修改成外部连接属性。
    1. static关键字能够将全局变量和函数修改成内部链接属性。
    2. 全局变量默认为外部连接属性:
      C main.c #include <stdio.h> int i; int main(){return 0;}; test.c #include <stdio.h> int i=0; gcc -c main.c test.c //success gcc -o main main.o test.o //multiple definination of "i" main.c修改: #include <stdio.h> extern int i;//经过使用extern将该全局变量声明为外部连接属性,使用外部定义的变量。 int main(){return 0;} gcc -o main main.o test.o //success
    3. 函数经过extern关键字修饰为全局链接属性,指的是该函数可能在其余源文件中进行定义。
      C main.c #include <stdio.h> extern int printHello();//仅指明该函数是在外部函数中声明定义。 int main(){ printHello(); return 0; } test.c #include <stdio.h> int printHello(){ printf("hello\n"); return 0; }
相关文章
相关标签/搜索