zoukankan      html  css  js  c++  java
  • 【学习笔记】【C语言】static和extern对函数的作用

    如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数。将这些相关联的目标文件链接在一起后才能生成可执行文件。

    外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。
    内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规定不同的源文件可以有同名的内部函数,并且互不干扰。

    1.static
    * 在定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数),这样该函数就只能在其定义所在的文件中使用。如果在不同的文件中有同名的内部函数,则互不干扰。
    * static也可以用来声明一个内部函数
     
    2.extern
    * 在定义函数时,如果在函数的最左边加上关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
    * 在一个文件中要调用其他文件中的外部函数,则需要在当前文件中用extern声明该外部函数,然后就可以使用,这里的extern也可以省略。

    3.代码

    main.c文件

     1 /*
     2  外部函数:定义的函数能被本文件和其他文件访问
     3  1> 默认情况下所有函数都是外部函数
     4  2> 不允许有同名的外部函数
     5  
     6  内部函数:定义的函数只能被本文件访问,其他文件不能访问
     7  1> 允许不同文件中有同名的内部函数
     8  
     9  static对函数的作用:
    10  1> 定义一个内部函数
    11  2> 声明一个内部函数
    12  
    13  extern对函数的作用:
    14  1> 完整地定义一个外部函数
    15  2> 完整地声明一个外部函数
    16  (extern可以省略,默认情况下声明和定义的函数都是外部函数)
    17  */
    18 
    19 
    20 // 声明一个test函数
    21 // 完整地声明一个外部函数
    22 // extern可以省略
    23 //extern void test();
    24 void test();
    25 
    26 //void test2();
    27 
    28 int main()
    29 {
    30     test();
    31     
    32     //test2();
    33     return 0;
    34 }
    35 
    36 //void test()
    37 //{
    38 //    
    39 //}
    40 static void test2()
    41 {
    42     
    43 }

    one.c文件

     1 #include <stdio.h>
     2 
     3 // 声明一个内部函数
     4 static void test2();
     5 
     6 // 完整地定义一个外部函数
     7 /*
     8 extern void test()
     9 {
    10     printf("调用了test函数
    ");
    11 }*/
    12 // 默认情况下,所有的函数都是外部函数,所以可以省略extern
    13 void test()
    14 {
    15     printf("调用了test函数
    ");
    16     
    17     test2();
    18 }
    19 
    20 
    21 // 定义一个内部函数
    22 static void test2()
    23 {
    24     printf("调用了test2函数
    ");
    25 }
     
     
  • 相关阅读:
    HTTP处理程序介绍
    c# Enum获取name,value和description
    如何成为优秀的软件人才
    关于系统设计分层
    从DLL中加载启动窗体
    摩斯密码
    休息下
    关于博文转载
    整合TextBox与Label 创建新控件EFLabelText
    ProC连接Oracle
  • 原文地址:https://www.cnblogs.com/dssf/p/4622765.html
Copyright © 2011-2022 走看看