zoukankan      html  css  js  c++  java
  • 程序结构

    今天继续学习c语言语法,相对之前的知识而言,这次的知识就比较重要了,算是C语言的核心基础了,所以得好好学它,下面正式开始:

    存储类别: 它指定了变量生存期(时间)与作用域(空间)
     
    对于下面这个函数:
     
     
     
    运行结果:
    解析:
    静态变量,只分配一次内存,离开作用域的时候,生存期并未结束,它的生存期是整个程序的执行期[这也说明作用域和生存期是不一样的],所以上面执行了两次的结果累加了。
    另外,需要注意:
     
    关于这个可以参考博文:http://www.cnblogs.com/webor2006/p/3427567.html,里面有详细的说明。
     
     
    下面有两个C文件:
    test.c的内容:
    1_9.c的内容:
    这时编译两个c到一个可执行文件:
     
    解决之道,就是将test.c的文件中的全局变量声明为static的,因为static修饰全局变量,它的作用域只限本文件中,对于1_9.c是看不到的:
    这时编译就成功了:
     
    这个依照静态全局变量的,就很容易理解了:
    test.c:
    1_9.c:
    这时编译:
     
    将test.c的函数声明为静态的,这时就成功了:
     
    提示:不管是局静态局部变量还是静态全局变量生存期是整个程序执行期
     
     
    修饰变量:
    还是两个.c文件:
    test.c声明一个全局变量:
     
    而如果1_9.c想直接用这个变量会怎么样呢?
     
     
    那如果就是想用test.c定义的全局变量呢,这时extern就派上用场了:
    再次编译,这回就成功了:
     
    修饰函数:
    test.c:
    1_9.c:
     
    编译貌似没有报错:
    但如果把警告打开再编译一下:
    所以,并非直接能调用其它文件声明的全局函数,而还得用上extern来解决:
    这时再编译:
     实际上,对于函数,extern关键字可以省略,但是变量则不行,如下:
     
    另外,还有两个修饰关键字,可以了解一下:
     
    标识符的五种作用域[了解下既可!]:
     
    ①只能在函数体中引用
    ②标签号(用于goto)是唯一具有函数作用域的标识符
     
    ①在程序块中声明的标识符具有块作用域,块作用域开始于声明处,结束于程序块的右花括号
    很容易理解,平常只是我们没将它理论化而已:
     
     
    ②函数的形式参数、函数的局部变量、在复合语句中声明的变量具有块作用域
     
    ③如果外层块和内层块有相同名字的变量,外层说明会被内层说明屏蔽(最近嵌套原则)
     
    在一个程序文件的所有函数定义之外定义的标识符,则该标识符具有全局作用域,即该标识符在整个程序包括的所有文件中都有效,都是可见的,都是可以访问的。
    也就是extern全局变量, extern函数
     
    在函数外面定义的标识符并且用static修饰,能够被从标识符说明到文件结束之间的所有函数引用
    也就是static全局变量、static函数定义或函数原型
     
    预处理指令:
     
     
    下面有三个文件:test.c、test.h、1_9.c,来演示一下预编译指今的用法:
    它们的关系如下:
    test.h:
    // ifndef defing endif 是为了防止重复包含头文件
    #ifndef _TEST_H_
    #define _TEST_H_
    
    void fun(void);//声明了函数
    
    
    #endif /* _TEST_H_ */

    test.c:

    #include <stdio.h>
    
    void fun(void)
    {
        printf("hello fun test ...\n");
    }

    1_9.c:

    #include <stdio.h>
    #include "test.h"//包含头文件
    
    int main(void)
    {
        fun();
        return 0;
    }

    运行:

    将函数放到.h里面声明的好处,可以复用,需要调用的.c文件中只需包含一下.h文件既可,另外,全局变量最好不要定义.h头文件中,而应该放到.c文件中

    为了说明这个原因,再增加一个.c文件,如下:

    里面啥都不做,只包含头文件:

    这时在.h中声明一个全局变量,注意:不是static的:

    test.h:

    我们知道1_9.c也包含了test.h头文件,也就是test.h现在被test2和1_9.c所包含,这时编译:

    这也就是为什么全局变量最好不要定义.h头文件中的原因了,当被多个文件包含时就会出现上面的错误,虽说在.h中已经有重复定义的判断了,那怎么解决呢?

    解决方法如下:

    test.c:

    test.h:

    这时,其它都不用变,test.h还是被两个文件同时包含,再编译就成功了:

    条件编译:
    下面举一个在程序中使用条件编译的用法:
    默认编译运行:
     
    这时我们在文件中定义一个DEBUG宏:
     
     
    另外,也可以不在程序中加入这个宏的定义,而在gcc编译时携带参数来编译出带这个宏的可执行文件:
    先将宏定义从源文件去掉:
     
     
    好了,这次的内容就学到这,里面的东西需细细体会,这也基础知识也是助自己深入学习C很有利的因素,之后就已经到了C语言的最核心的部分了,所以需不骄不躁,一步一个脚印学习。
  • 相关阅读:
    使用yum命令报错
    CentOS6.8安装Python3.6.3
    解决 linux 下安装 node 报: command not found
    Python的pip源切换为国内阿里云镜像
    开源Java加密工具Jasypt 1.4发布
    JavaFX对Java开发者到底意味着什么?
    16 个印象深刻的 HTML5/CSS3/JavaScript 体验
    高效的Java异常处理
    Java开发的学习过历程
    Java中23种设计模式详解
  • 原文地址:https://www.cnblogs.com/webor2006/p/3460345.html
Copyright © 2011-2022 走看看