【前言】

  最近几个月在做一个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 = ;
      const int Value = ; //外部链接,可以仅作为声明,不作初始化
      extern const int value = ;
    • 修饰指针:
      //两种形式,指针本身是常量,不可变
      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文件里也可以定义变量,但不建议这样做,一方面也是为了引入头文件时的重复定义问题,头文件也加宏定义头防止重复引入。

C语言之头文件,static与const关键字的更多相关文章

  1. C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

      c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络 ...

  2. C++ —— 类中static和const关键字声明变量的初始化方式总结

    在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...

  3. c语言的头文件-不是c++类的头文件?

    下面的概述是参考的这篇文章:http://blog.csdn.net/bingxx11/article/details/7771437 c语言编程中也有,也需要头文件, 头文件不只是C++的类才需要! ...

  4. C语言中头文件和cpp文件解析

    务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...

  5. c语言_头文件_stdlib

    简介 stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C.C++语言的最常用的系统函数 该文件包含了C语言标准库函数的定义 stdlib.h里面定义了五 ...

  6. C语言中头文件<stdio.h>中的#ifndef _STDIO_H_

    先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  7. C语言中头文件——你乱吗????

    如果尔等之辈问本大神,为什么需要头文件呢?本大神告诉你:想要知道为什么需要头文件的话,你就应该知道C语言编译的过程: 本大神为你们准备了基本知识: C语言文件的编译与执行的四个阶段并分别描述: C++ ...

  8. c语言_头文件_windows.h

    概述 Win32程序的开头都可看到: #include <windows.h> WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件 ...

  9. c语言_头文件

    传统 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <assert.h> //设定插入点 #include <ctyp ...

随机推荐

  1. 转:阿里旺旺导致python安装包失败的解决办法

    我以前使用web.py没事,今天运行时报错, mimetypes.init() # try to read system mime.types File "D:\ProgramFiles\p ...

  2. SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录

    14.5.2.4 Locking Reads 锁定读: 如果你查询数据然后插入或者修改相关数据在相同的事务里, 常规的SELECT 语句不能给予足够的保护. 其他事务可以修改或者删除你刚查询相同的记录 ...

  3. java学习之数组(二)

    在上一节中我们讲到了数组的概念,定义,以及在内存当中的表现形式.那么这里我们来说一下,数组的另一种定义方式. 在上一篇当中我们规定是这个样子定义数组的, class ArrDemo { public ...

  4. 自己动手实现智能指针auto_ptr

    面试的时候,我们经常会被问到如何自己动手实现智能指针auto_ptr.今天我就一边参考STL库中的源代码,一边将auto_ptr的实现敲一遍. auto_ptr归根到底是一个模版类,那么这个类要实现哪 ...

  5. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  6. 图论(差分约束系统):POJ 1201 Intervals

    Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24099   Accepted: 9159 Descri ...

  7. SQL 2005远程连接是出错(provider: SQL 网络接口, error: 28 - 服务器不支持请求的协议

    SQL 2005远程连接是出错(provider: SQL 网络接口, error: 28 - 服务器不支持请求的协议 sql远程连接服务器网络sql serversqlserver 解决方法:在服务 ...

  8. Java Topology Suite (JTS)与空间数据模型

    JTS是Java的处理地理数据的API,它提供以下功能: 实现了OGC关于简单要素SQL查询规范定义的空间数据模型 一个完整的.一致的.基本的二维空间算法的实现,包括二元运算(例如touch和over ...

  9. 【数学】【NOIp2012】同余方程 题解 以及 关于扩展欧几里得与同余方程

    什么是GCD? GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可).在开头,我们先下几个定义: ①a|b表示a能整除b(a是b的约数) ②a mod b表示a-[a/b]b([a/b]在Pa ...

  10. lyGrid表格插件

     表格基础参数: grid = lyGrid({           l_column : [{//表格列表数据                 colkey : null,              ...