zoukankan      html  css  js  c++  java
  • C语言之头文件,static与const关键字

    【前言】

      最近几个月在做一个C语言代码重构的项目,过程中也让我对之前在书本上学习到的东西有些补充和巩固,在本博中总结记录下,梳理下零碎的知识点和经验也加深印象,书写是为了更好地思考。平时也都是用印象笔记之类的自己写写笔记,今天整理成博客,以便自己以后回顾。

    【正文】

    • C语言头文件:将其理解为C语言模块化编程向外提供一个接口描述文件。一般包括一些供外部函数或者文件使用的变量声明,函数声明,数据类型定义以及宏定义等。举例:
    • /*******************************************************************************
       头文件 test001.h
      *******************************************************************************/
      #ifndef TEST001_H_INCLUDED  //防止头文件重复引入
      #define TEST001_H_INCLUDED
      
      /*
      * 在源码文件test001.c中:#define TEST001_GLOBAL_VALUE_DEFINE
      * 设置宏ifdef判断,如果是除test001.c外其他文件引入此头文件,则以下的变量声明和函数声明都会加extern修饰
      * 声明为外部函数和全局变量
      */
      #ifdef TEST001_GLOBAL_VALUE_DEFINE
      #define TRNS_GLOBAL
      #define TRNS_GLOBAL_VAL(v)    =(v)
      #else
      #define TRNS_GLOBAL            extern
      #define TRNS_GLOBAL_VAL(v)    
      #endif
      
      //函数声明
      TRNS_GLOBAL void InitTest(void);                                        
      TRNS_GLOBAL void eventStart(int* point);                        
      
      //变量声明
      TRNS_GLOBAL double f_InitGetReq;                        
      TRNS_GLOBAL double f_ErrConfirm;
      
      #define BLM_SEND_BUFF_SIZE    12                            
      #define BLM_RECV_BUFF_SIZE    128                            
      
      #undef TRNS_GLOBAL
      #undef TRNS_GLOBAL_VAL
      
      #endif
    • static关键字:
      • 全局静态变量:在任何函数体外声明定义静态变量,使其只在本文件有效,其可见范围是从定义它的位置到文件结束,对其他模块不可见。
      • 局部静态变量:在函数体内声明定义静态变量,其可见范围是本函数,只有第一次调用此函数时,该static变量会被定义,其生命周期持续到整个程序结束,后续调用该函数时,其值还保持上一次调用后的值,不会进行重复定义。
      • 静态函数:被声明为static的函数,表示其只在被模块内可用,不作为对外的接口,可以理解为private。其他文件看不到,所有有重名的函数也没有关系,互不影响。
    • const关键字:
      • 修饰变量:
        //两种形式,定义Value是不可变的int型变量
        int const Value = 10;
        const int Value = 10;
        
        //外部链接,可以仅作为声明,不作初始化
        extern const int value = 20;
      • 修饰指针:
        //两种形式,指针本身是常量,不可变
        char * const pValue;  
        const (char*) pValue; 
        
        //两种形式,指针指向的对象是常量
        const char * pValue;  
        char const * pValue; 
        
        //两者都是常量
        const char * const pValue; 
      • 修饰函数参数:
        //参数在函数体内不可变(无意义,形参,传递的实参是一个拷贝)
        void function(const int Num); 
        
        //参数指针指向的内容在函数体内不可变
        void function(const char* Num);
        
        //参数指针是常量(无意义,该指针是形参)
        void function(char* const pValue);
        
        //引用参数在函数体内不可变
        void function(const int& Num);   
      • 修饰函数返回值:
        //表示函数返回值一个常量,只能被赋值给const修饰的同类型指针
        const char* function();
        const char* str = function();
        char* str1 = function();//出错
      • 作用与优势:保护被修饰的成员,防止意外修改,增强程序的健壮性。相比于#define预编译指令只是简单的替换不进行类型检查,const更加安全。编译器通常部位普通const常量分配存储空间,而将其保存在符号表中,在编译期间就确定其值且不变,省去存储于读写内存的操作,提高效率。
    • 文件包含:
      • 可以这样理解,文件A包含文件B,即A将文件B的内容拷贝过来在引入的位置展开,相当于将两个文件合并。
      • 所以简单的文件包含,尤其是.c文件包含,很容易产生重复定义的问题。
      • .h文件里也可以定义变量,但不建议这样做,一方面也是为了引入头文件时的重复定义问题,头文件也加宏定义头防止重复引入。
  • 相关阅读:
    设置文本框的 placeholder 的颜色
    CSS单行文字超出省略
    【持续跟新】剑指Offer_Java实现
    Android必修课-Activity生命周期
    如何查看Android的jks签名的MD5
    Flutter 文字边框/边框颜色
    Flutter initState 初始化调用 Provide报错
    flutter 系统通知栏Demo 基于flutter_local_notifications: ^1.4.1
    # Flutter学习笔记(一)
    一个技术人毕业到就业的思考
  • 原文地址:https://www.cnblogs.com/shuyingsoaring/p/5133888.html
Copyright © 2011-2022 走看看