標題: 請問自己寫的C語言頭文件里要把相應的.c文件中所有的函數(shù)和變量都包括嗎? [打印本頁]

作者: 明日香    時間: 2020-12-2 09:28
標題: 請問自己寫的C語言頭文件里要把相應的.c文件中所有的函數(shù)和變量都包括嗎?
比如說這是我寫的LCD.c文件:
#include<reg52.h>
#include<intrins.h>
#include "LCD.h"
#define uchar unsigned char
#define uint  unsigned int
#define IODATA  P0
sbit E=P2^2;    //1602使能引腳
sbit RW=P2^1;    //1602讀寫引腳   
sbit RS=P2^0;    //1602數(shù)據(jù)/命令選擇引腳
uchar strwind[];
void delay(uint ms)  
{
uint i,j;
        for(i=ms;i>0;i--);
        
         for(j=120;j>0;j--);
}

void wcmd(uchar del)//寫命令函數(shù)
{
  RS=0;//命令選擇端
        delay(10);
        RW=0;//寫命令
        delay(10);
        IODATA=del;  //把命令字寫入
        delay(10);
        E=1;//使能
        delay(10);
        E=0;
}

void lcd1602_writedata(uchar dat)//寫數(shù)據(jù)函數(shù)
{
  delay(10);
        RS=1;//數(shù)據(jù)選擇端
        delay(10);
        RW=0;//寫命令
        delay(10);
        IODATA=dat;  //把要顯示的數(shù)據(jù)寫入
        delay(10);
        E=1;
        delay(10);
        E=0;
}

void lcd1602_init()//LCD初始化
{
wcmd(0x38);
wcmd(0x0C);
wcmd(0x06);
wcmd(0x01);
}

void lcd1602_show(uchar a)
{
        uchar m=0;
        lcd1602_init();
        delay(1000);
        wcmd(a);
        delay(1000);
        for(m=0;m<4;m++)
        {
        lcd1602_writedata(strwind[m]);
  }
}

由于我要在其他的.c文件里用到LCD.c里的函數(shù)和變量,所以寫了一個相應的頭文件:LCD.h
如下:
#ifndef _LCD_H
#define _LCD_H
#define uchar unsigned char
#define uint  unsigned int
void delay(uint ms);
void lcd1602_init();
void wcmd(uchar del);
void lcd1602_writedata(uchar dat);
void lcd1602_show(uchar a);
extern uchar strwind[];
#endif


請問這樣寫對嗎?是需要把LCD.C里的函數(shù)和變量都包括嗎?

作者: amandv    時間: 2020-12-2 11:57
你可以把定義放在H文件中所有的C調用,或在主程序定義,在其他C文件引用定義
作者: xy07580782    時間: 2020-12-2 12:15
所有的宏定義,函數(shù)名放里面就可以了,變量數(shù)組不用.
作者: csmyldl    時間: 2020-12-2 13:35
可以放入,也可以不放入,主要看你的程序組織結構,作為頭文件,只是預處理的一種,只要符合要求,預處理都可以進行。
作者: 黃youhui    時間: 2020-12-2 16:00
需要被其他C文件調用的才放
作者: 蟹黃味瓜子仁    時間: 2020-12-2 16:25
可以把所有的函數(shù)和變量都包括進去,也可以只包括要被其他文件調用的函數(shù)和變量。
作者: 回憶不堪回首    時間: 2020-12-7 16:57
我曾經(jīng)看過把程序直接寫.h文件里的。。。。。沒有.c文件。。。
作者: xyfzq    時間: 2020-12-7 21:33
不需要都放在里面,主要就是放一些宏定義,以及會被其他.c文件調用的變量
作者: 老馬工作室    時間: 2020-12-8 13:05
以在下拙見:

1.函數(shù)和全局變量:
如果函數(shù)僅僅在本文件使用,像void wcmd(uchar del)這個函數(shù),一般來說不會被在其它文件(如:main.c)調用,可以不用在頭文件聲明,寫在調用他的函數(shù)前面就行了。
不過按照規(guī)范,本文件的函數(shù)前面定義和聲明的時候應該加上 static 這個關鍵字,static void wcmd(uchar del),表明這個是本文件的函數(shù),不允許其它文件調用,并在lcd.c的前面聲明,不在頭文件聲明。
變量跟函數(shù)是同一個道理,就看是本文件使用還是整個工程使用,如果是僅僅在本文件調用,那么定義的時候:static char name; 如果其它也要調用,就把static去掉,在其它文件上要調用的話,在調用的文件上聲明 extern char name; 。

2.宏定義:
如果宏需要被其它文件使用,就在源文件(.c文件)定義,否則就在頭文件定義。

3. "#define uchar unsigned char" 這一段建議改成 "typedef char uchar;",建議查一下 #define 和typedef def 的區(qū)別。
作者: suncat0504    時間: 2020-12-8 19:53
做過其他軟件嗎?比如java。當某個函數(shù)需要被外部程序使用的時候,如果想暴露給外部程序,需要使用public聲明。同樣的,c程序中,如果外部程序使用這個程序中的某個函數(shù),他得知道去哪里找。所以設置了頭文件。相當于告訴外部程序需要的函數(shù)在哪里。不被外部程序調用的函數(shù),可以不放在頭文件中。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1