精华内容
下载资源
问答
  • .c和.h文件都是源文件,除了后缀不一样便于区分外和管理外,其他都是相同,在.c编写代码同样也可以写在.h,包括函数定义、变量定义、预处理等。 但是,.h和.c在项目承担角色不一样:.c 文件主要负责...

    .c.h文件都是源文件,除了后缀不一样便于区分外和管理外,其他的都是相同的,在.c中编写的代码同样也可以写在.h中,包括函数定义、变量定义、预处理等。

    但是,.h 和 .c 在项目中承担的角色不一样:.c 文件主要负责实现,也就是定义函数和变量;.h 文件主要负责声明(包括变量声明和函数声明)、宏定义、类型定义等。这些不是C语法规定的内容,而是约定成俗的规范,或者说是长期形成的事实标准。

    根据这份规范,头文件可以包含如下的内容:

    • 可以声明函数,但不可以定义函数。
    • 可以声明变量,但不可以定义变量。
    • 可以定义宏,包括带参的宏和不带参的宏。
    • 结构体的定义、自定义数据类型一般也放在头文件中。


    在项目开发中,我们可以将一组相关的变量和函数定义在一个 .c 文件中,并用一个同名的 .h 文件(头文件)进行声明,其他模块如果需要使用某个变量或函数,那么引入这个头文件就可以。

    这样做的另外一个好处是可以保护版权,我们在发布相关模块之前,可以将它们都编译成目标文件,或者打包成静态库,只要向用户提供头文件,用户就可以将这些模块链接到自己的程序中。

    展开全文
  • 【C++】C语言模块化编程中的头文件

    千次阅读 2018-10-10 12:47:21
    linux下使用sublime比较好,比IDE强多了。     宏定义 #define 要写在头文件中... 结构体定义、自定义数据类型一般也放在头文件中。   在项目开发,我们可以将一组相关变量和函数定义在一个 .c 文件...

    linux下使用sublime比较好,比IDE强多了。

     

     

    宏定义 #define 要写在头文件中。

    根据这份规范,头文件可以包含如下的内容:

    • 可以声明函数,但不可以定义函数。
    • 可以声明变量,但不可以定义变量。
    • 可以定义宏,包括带参的宏和不带参的宏。
    • 结构体的定义、自定义数据类型一般也放在头文件中。

     

    在项目开发中,我们可以将一组相关的变量和函数定义在一个 .c 文件中,并用一个同名的 .h 文件(头文件)进行声明,其他模块如果需要使用某个变量或函数,那么引入这个头文件就可以。
    这样做的另外一个好处是可以保护版权,我们在发布相关模块之前,可以将它们都编译成目标文件,或者打包成静态库,只要向用户提供头文件,用户就可以将这些模块链接到自己的程序中。

    展开全文
  • 详解keil采用C语言模块化编程时全局变量、结构体定义、声明以及头文件包含处理方法!  以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点项目,程序动则几千行,这种方式无疑会带来N...

    详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!

               以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧!

        后来学会了在keil里进行模块化编程,即只把功能相同或相近的函数写在同一个c文件,这样以来一个项目往往由很多个c文件组成,但又带来一个问题即是某些c文件之间需要相互通信,一般我们都采用了全局变量,对吧。很多同学虽然知道在其它c文件里引用全局变量要用extern进行声明,但对此操作时往往思路不清,迷迷糊糊,经常遇到一堆错误提示,然后一个一个排除,既费时又费力,可怕的是下次还会遇到同样的问题。本人曾经也遇到过类似问题,故在此将模块化编程里的全局变量、结构体、头文件相关问题详述一遍,大家照着做,就能确保无误!

          一、关于全局变量的定义、声明、引用:

    方法1:

    在某个c文件里定义全局变量后,在其它c文件要用,则在要用c文件里用extern进行声明。说来轻巧但还是很多同学会出问题。请看下面注意事项方可解决!

    注:

    (1)在定义全局变量时可同时将其初始化

    (2)在用extern声明时不能再初始化,否则编译器报错

    举例:有两个c文件分别为one.c和two.c,two中要用到one中的全局变量N,怎么办?

    答案:在one.c中定义且初始化:u8 N =0;

       再在two.c中声明:extern u8 N;(注:此处不能加= 0)

     

    方法2:

    同样对于方法1中的例子,我推荐采用方法2。

    答案:在one.c中定义且初始化:u8 N =0;

       再在one.h中用extern声明:extern u8 N;(注:此处不能加=0)           

       最后在two.c中包含one.h:#include "one.h"     

    由于方法2的可移植性较方法一要强,故采用2较好!

    对方法2的总结为:全局变量的定义和初始化放在c文件中,声明放在对应的h文件中。 且要注意h文件里应仅有相应c文件里的函数和变量的声明,和相应c文件无关的东西不应该有。

     

    二、关于头文件的包含:

      头文件的包含就比较简单了:在相应c文件里一一包含所需的h文件即可。但千万不要将这些头文件全部放在c文件的相应头文件里,虽然这样会使c文件仅包含了一个头文件,看起来比较简洁,但这样会影响它的h文件的“纯洁性”。              

      在此提醒下新手们:要将c文件和其对应的h文件看成一体,即它们互相有着紧密联系;移植时,将它们同时搬走就行!

     

    三、关于结构体类型的定义:

      1、若结构体类型只需要在某个c文件中使用,那么就在相应c文件里定义该结构体即可。

      2、若结构体类型要在多个c文件中使用,那么就应该在头文件中定义该结构体,再在要用它的文件中包含结构体定义所在的头文件即可。

     

    展开全文
  • 嵌入式 Linux C语言(十一)——C语言模块化编程一、C语言模块化...C语言模块化编程中对.c、.h文件潜规则: 1、.c 文件主要负责实现,也就是定义函数;.h 文件主要负责声明,比如函数声明、宏定义等,结构定义、

    嵌入式 Linux C语言(十一)——C语言模块化编程

    一、C语言模块化编程

        所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明。C语言模块化编程中对.c、.h文件的潜规则:

         1、.c 文件主要负责实现,也就是定义函数;.h 文件主要负责声明,比如函数声明、宏定义等,结构的定义、自定义数据类型一般也放在头文件中,不能在.h文件中定义变量。将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函数放在.h文件中。

        定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。

        2、引入编译器自带的头文件(包括标准头文件)用尖括号,引入自定义头文件用双引号,例如:

    #include <stdio.h>

    #include "myFile.h"

        头文件应当是幂等的。也就是说,多次包括头文件的效果和仅包括一次的效果完全相同。

    #ifndef _STDIO_H

    #define _STDIO_H

    /* 声明部分 */

    #endif

         3、模块提供给其它块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;模块内的函数和全局变量需在.c文件开头冠以static关键字声明。

    二、嵌入式系统开发中的模块化编程

    嵌入式系统通常包括两类模块:

      (1)硬件驱动模块,一种特定硬件对应一个模块

      (2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差;模块内各元素(语名之间、程序段之间)联系的越紧密,内聚性就越高。

    1单任务系统

        所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。

    单任务程序典型架构

      (1)从CPU复位时的指定地址开始执行;

      (2)跳转至汇编代码startup处执行;

      (3)跳转至用户主程序main执行,在main中完成:

      a.初试化各硬件设备;

      b.初始化各软件模块;

      c.进入死循环(无限循环),调用各模块的处理函数

      用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循环,其首选方案是:

    while(1)
    {
    }

    2多任务系统

            多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB包括任 务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB还被用来存 放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。

        究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。

    3中断服务程序

        中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。

    中断服务程序需要满足如下要求:

      (1)不能返回值;

      (2)不能向ISR传递参数;

      (3) ISR应该尽可能的短小精悍;

      (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

    4硬件驱动模块

      一个硬件驱动模块通常应包括如下函数:

      (1)中断服务程序ISR

      (2)硬件初始化

      A、修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);

      B将中断服务程序入口地址写入中断向量表:

    /* 设置中断向量表 */
    m_myPtr = make_far_pointer(0l); /* 返回void far型指针void far * */
    m_myPtr += ITYPE_UART; /* ITYPE_UARTuart中断服务程序 */
    /* 相对于中断向量表首地址的偏移 */
    *m_myPtr = &UART _Isr; /* UART _IsrUART的中断服务程序 */

      (3)设置CPU针对该硬件的控制线

      A、如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号;

        B、设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。

      (4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。


        本文介绍了C语言模块编程的主要思想,嵌入式系统开发中模块划分、多任务还是单任务选取、单任务程序典型架构、中断服务程序、硬件驱动模块设计等。

    本文是学习网络博文并经自己思考总结整理而来,博文来源有:

        C语言中文网、C语言模块化程序设计(EDN电子技术设计 wnhb)、嵌入式C语言之---模块化编程 (CSDN zhzht19861011)。

        由于网络博文繁杂,无法一一查明原出处,所列来源为本人学习时所查阅资料。


    本文出自 “生命不息,奋斗不止” 博客,请务必保留此出处http://9291927.blog.51cto.com/9281927/1790678

    展开全文
  • C语言编写程序时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同c文件,希望这个全局变量能在两个文件中共用。举例说明:项目文件夹project下有main.c、common.c和...
  • 1、模块化编程概念 所谓模块化编程,就是多文件(.c文件)编程,一个 .c 文件和一个 .h 文件可以被称为一个模块。 如果你学习C语言很久了,还只会在一个 .c 文件里写代码,那么今天将会让你突破,带你了解多文件编程,教...
  • (只要是在.h文件定义变量,然后在main.c包含该.h文件,那么定义变量就可以在main函数作为全局变量使用) 方法1: 在某个c文件里定义全局变量后,在其它c文件要用,则在要用c文件里用extern进行声明。说...
  • 模块化 嵌入式编程中需要对程序进行模块划分 模块划分"划"是规划意思,意指怎样合理将...相对论), C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件结合,头文件...
  • C语言模块化开发(多文件编程

    千次阅读 2017-09-16 09:25:31
    1.main.c是程序模块,module.c是程序一个模块,main使用extern int m来声明变量,定义在module,说明module定义全局变量作用域是整个程序。 2.假如要使用printf函数话就添加头文件stdio.h,头文件...
  • C语言模块化编译介绍

    2015-06-25 20:26:00
    模块化编程的概念  所谓模块化变成(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块。 头文件开发注意事项: 1)头文件中可以和C程序一样引用其它头文件,可以写预处理块,...
  • 一、关于全局变量定义、声明、引用:(只要是在.h文件定义变量,然后在main.c包含该.h文件,那么定义变量就可以在main函数作为全局变量使用)方法1:在某个c文件里定义全局变量后,在其它c文件要用,则在...
  • C语言中头文件写法

    万次阅读 2015-03-25 18:39:07
    在实现C语言模块化编程时,通常会用到*.h式的头文件的编写,在此记录下头文件的基本写法。 通常我们写C程序时,都会直接使用这样的语句“#include ”。这便是我们通常说的头文件。头文件通常用作函数声明,变量声明...
  • C语言中的模块化体现在两个方面: 1 函数。 函数是C语言的最小单位,每个函数均实现一个独立的功能,于是每个函数均可以当做是一个最小的功能模块。这样,C语言就实现了最基本的模块化。 2 文件。 在C语言中,支持...
  • C语言学习之模块化编程

    千次阅读 2012-05-01 16:20:17
    这就需要将程序有序的组织在不同的文件中,头文件中只是程序的接口部分,而在源文件中负责具体实现,如果其他源文件中有需要调用该源文件中的某个函数,只需要包含头文件即可。以欧几里德算法计算两个数的最大公约数...
  • 07-02 C语言模块化编程概念 1. 概念 所谓模块化编程(多文件开发),就是多文件(.c文件)编程,一个.c 文件和一个.h文件可以被称为一个模块。把功能相似函数封装在不同文件 2.以下场景会使用头文件 2.1 通过...
  • C语言作为一种结构化程序设计语言,在模块划分上主要依据功能(依功能进行划分在面向对象设计成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:  (1) 模块即是一个.c文件和一个...
  • 模块即是一个.c文件和一个.h文件结合,头文件(.h)是对于该模块接口声明 液晶驱动模块以实现字符,汉字,和图像实现,命名为led_device.c,该模块.c文件大体可以写成: /***********************...
  • 在模块划分上主要依据功能依功能进行划分在面向对象设计成为一个错误牛顿定律遇到了相对论)C语言模块化程序设计需理解如下概念 模块即是一个.c文件和一个h文件结合,头文件.h是对于该模块接口声明;
  • C语言作为一种结构化程序设计语言,在模块划分上主要依据功能(依功能进行划分在面向对象设计成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:  (1) 模块即是一个.c文件和一个...
  • C语言头文件规则

    2012-02-02 17:25:02
    C程序采用模块化的编程思想,需合理地将一个很大软件划分为一系列功能独立部分合作完成系统需求,在模块划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件正确使用方法是: * 规则1 ...
  • 模块化编程的概念:我们把功能相似函数封装到不同文件 实现:.c文件 C语言的源文件  .h文件 (header)头文件 优点:1.用时候,只需要包含.h文件,对外隐藏.c文件  2.团队分工和协作  3.可以把...
  • C语言作为一种结构化程序设计语言,在模块划分上主要依据功能(依功能进行划分在面向对象设计成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件...
  • C语言作为一种结构化程序设计语言,在模块划分上主要依据功能(依功能进行划分在面向对象设计成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:  (1) 模块即是一个.c文件和一个....
  • C语言头文件规则

    2010-06-17 09:15:20
    C程序采用模块化的编程思想,需合理地将一个很大软件划分为一系列功能独立部分合作完成系统需求,在模块划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件正确使用方法是: * 规则1...
  • 模块化编程总结

    2016-03-08 10:39:00
    一直以为自己对模块化编程彻底明白了,但是偶尔看到有些条件编译感觉莫名其妙,今天一起做个总结。 1、单个功能模块建立源文件.c,和头文件.h,注意.c后缀对于C语言必须小写,有些编译器(如GCC),会认为大写C...
  • C语言头文件使用规范

    2017-04-01 18:38:17
    C程序采用模块化的编程思想,需合理地将一个很大软件划分为一系列功能独立部分合作完成系统需求,在模块划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件正确使用方法是:  * ...
  • 在模块划分上主要依据功能(依功能进行划分在面向对象设计成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:(1)模块即是一个.c文件和一个.h文件结合,头文件(.h)是对于该模块...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

c语言模块化编程中的头文件

c语言 订阅