欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 問(wèn)兩個(gè)關(guān)于單片機(jī)C語(yǔ)言編程的問(wèn)題 [打印本頁(yè)]

作者: 董董    時(shí)間: 2019-6-7 06:32
標(biāo)題: 問(wèn)兩個(gè)關(guān)于單片機(jī)C語(yǔ)言編程的問(wèn)題
/*************************第一個(gè)問(wèn)題***********************************************/
    第一個(gè)問(wèn)題:如下圖所示,我這里是有五個(gè)源文件,然后有四個(gè)頭文件,因?yàn)楹瘮?shù)只能在頭文件聲明而不能定義,所以函數(shù)都需要寫(xiě)在對(duì)應(yīng)的源文件中。包含main()函數(shù)的主文件再編譯的時(shí)候會(huì)把源文件中include的頭文件都原封不動(dòng)地搬到主源文件中來(lái),但是最后鏈接的時(shí)候因?yàn)樗泻瘮?shù)定義都是在別的源文件中,所以在鏈接的時(shí)候主源文件也會(huì)把其他源文件中定義的函數(shù)直接搬運(yùn)過(guò)來(lái)嗎?我可能表述的不太清楚,下面我就拿我其中一個(gè)源文件和頭文件舉例子吧。


************舉例子**********************
以下是頭文件Display.h的內(nèi)容,其中有void Display(uchar firstbit, uchar num)的聲明而不是定義
單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #ifndef __DISPLAY_H__
  3. #define __DISPLAY_H__

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define KeyPort P3
  7. #define DataPort P0

  8. sbit Bit_Latch = P2^1;
  9. sbit Seg_Latch = P2^0;
  10. extern bit ReadTimeFlag;

  11. extern code uchar DuanMa[10];
  12. extern code uchar WeiMa[8];
  13. extern uchar TempData[8];

  14. void Display(uchar firstbit, uchar num);
  15. void Init_Timer0();

  16. #endif
復(fù)制代碼

以下是Display.c源文件的內(nèi)容,有void Display(uchar firstbit, uchar num)的定義但是不會(huì)被include到主原函數(shù)中,那么最后主源文件被鏈接成功是怎么
實(shí)現(xiàn)Display()函數(shù)的功能呢?

  1. #include "Display.h"
  2. #include "Delay.h"


  3. uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  4. uchar code WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  5. uchar TempData[8];



  6. void Display(uchar firstbit, uchar num)
  7. {
  8.         static uchar i = 0;
  9.         
  10.         DataPort=0;
  11.         Seg_Latch = 1;
  12.         Seg_Latch = 0;
  13.         
  14.         DataPort = WeiMa[i+firstbit];
  15.         Bit_Latch = 1;
  16.         Bit_Latch = 0;
  17.         

  18.         
  19.         DataPort = TempData[i];
  20.         Seg_Latch = 1;
  21.         Seg_Latch = 0;
  22.         
  23.         
  24.         
  25.         i++;
  26.         if(i == num)
  27.         {
  28.                 i = 0;
  29.         }
  30. }

  31. void Init_Timer0()
  32. {
  33.         TMOD = 0x01;
  34.         TH0 = (65535-2000)/256;
  35.         TL0 = (65535-2000)%256;
  36.         EA = 1;
  37.         ET0 = 1;
  38.         TR0 = 1;
  39. }

  40. void Timer0() interrupt 1
  41. {
  42.         
  43.         static uchar  num;
  44.         TH0 = (65535-500)/256;
  45.         TL0 = (65535-500)%256;
  46.         Display(0,8);
  47.         num++;
  48.         
  49.         if(num == 50)
  50.         {
  51.                 num = 0;
  52.                 ReadTimeFlag = 1;
  53.         }
  54.         
  55. }
復(fù)制代碼


/***********************第二個(gè)問(wèn)題*******************************************/
    第二個(gè)問(wèn)題:在用C語(yǔ)言編寫(xiě)程序時(shí)需要經(jīng)常用到unsigned char和unsigned int,我一般習(xí)慣typedef unsigned char uchar;typedef unsigned int uint;
但是頭文件里用typedef會(huì)報(bào)錯(cuò),而且因?yàn)槲野褍?nèi)容分成好幾個(gè)源文件寫(xiě)了,所以在每一個(gè)頭文件里都要#define uchar unsigned char  #define uint unsigned int,這樣會(huì)搞的比較麻煩。我想問(wèn)下有什么好辦法能夠只寫(xiě)一次#define uchar unsigned char  #define uint unsigned int讓所有頭文件都能夠識(shí)別使用嗎?

作者: 董董    時(shí)間: 2019-6-7 06:47
如果使用typedef就會(huì)出現(xiàn)符號(hào)錯(cuò)誤,如下圖所示




作者: 董董    時(shí)間: 2019-6-7 20:37
各位進(jìn)來(lái)看下指點(diǎn)下呀,多謝了
作者: univers    時(shí)間: 2019-6-7 22:28
這個(gè)就是多文件,模塊化編程的原理了,每個(gè)個(gè)功能分開(kāi)編寫(xiě),清晰明了。放便以后移植。
作者: xing1954    時(shí)間: 2019-6-8 04:17
與編譯器有關(guān)吧。
作者: 董董    時(shí)間: 2019-6-8 05:44
univers 發(fā)表于 2019-6-7 22:28
這個(gè)就是多文件,模塊化編程的原理了,每個(gè)個(gè)功能分開(kāi)編寫(xiě),清晰明了。放便以后移植。

我知道不同功能分文件寫(xiě)是為了方便移植,我想問(wèn)的是main()函數(shù)在最后鏈接的時(shí)候會(huì)調(diào)用在別的源文件中定義的函數(shù)對(duì)吧?以及第二個(gè)問(wèn)題為啥typedef在頭文件里不能用呢?
作者: Pee_32    時(shí)間: 2019-6-8 15:13
typedef的頭文件你加了嗎?
作者: suncat0504    時(shí)間: 2019-6-8 15:24
你可以單獨(dú)做一個(gè)h文件,里面#define uchar unsigned char。然后再每個(gè)用到的c文件中引入這個(gè)h文件。使用typedef不行,我猜是因?yàn)殛P(guān)鍵字不能包含空格。typedef unsigned char uchar,在unsigned char之間存在空格,所以不行。但是使用typedef char* PCHAR這樣的可以。
作者: lele5211314    時(shí)間: 2019-6-8 17:31
頭文件相互包含
作者: 董董    時(shí)間: 2019-6-8 19:18
suncat0504 發(fā)表于 2019-6-8 15:24
你可以單獨(dú)做一個(gè)h文件,里面#define uchar unsigned char。然后再每個(gè)用到的c文件中引入這個(gè)h文件。使用ty ...

但是如果我在只有一個(gè)main()函數(shù)中用typedef unsigned char uchar是可以的,后面的用uchar沒(méi)有報(bào)錯(cuò),但是我一分開(kāi)文件在別的源文件寫(xiě)就報(bào)錯(cuò),不太明白。不過(guò)你說(shuō)的單獨(dú)寫(xiě)一個(gè)頭文件里面#define uchar unsigned char倒是一個(gè)很好的解決辦法,多謝指點(diǎn)了!
作者: a452541823    時(shí)間: 2019-6-8 19:21
#define是C語(yǔ)言中定義的語(yǔ)法,是預(yù)處理指令,在預(yù)處理時(shí)進(jìn)行簡(jiǎn)單而機(jī)械的字符串替換,不作正確性檢查,只有在編譯已被展開(kāi)的源程序時(shí)才會(huì)發(fā)現(xiàn)可能的錯(cuò)誤并報(bào)錯(cuò)。
typedef是關(guān)鍵字,在編譯時(shí)處理,有類(lèi)型檢查功能。它在自己的作用域內(nèi)給一個(gè)已經(jīng)存在的類(lèi)型一個(gè)別名,但不能在一個(gè)函數(shù)定義里面使用typedef。

根據(jù)typedef與define的定義,說(shuō)明你的頭文件沒(méi)有包含標(biāo)準(zhǔn)庫(kù)
作者: wfy1008    時(shí)間: 2019-6-8 19:57
董董 發(fā)表于 2019-6-8 05:44
我知道不同功能分文件寫(xiě)是為了方便移植,我想問(wèn)的是main()函數(shù)在最后鏈接的時(shí)候會(huì)調(diào)用在別的源文件中定義 ...

1)第一個(gè)問(wèn)題,你只要在調(diào)用的文件里include被調(diào)用函數(shù)聲明的頭文件即可
2)是因?yàn)槟阒貜?fù)定義了一個(gè)符號(hào),你可以把所有的類(lèi)型定義集中到一個(gè)頭文件,然后每個(gè)要使用的頭文件中都包含這個(gè)就可以了,這樣源文件就不用再次包含了
作者: 董董    時(shí)間: 2019-6-9 16:07
a452541823 發(fā)表于 2019-6-8 19:21
#define是C語(yǔ)言中定義的語(yǔ)法,是預(yù)處理指令,在預(yù)處理時(shí)進(jìn)行簡(jiǎn)單而機(jī)械的字符串替換,不作正確性檢查,只有 ...

一般單片機(jī)程序都是#include <reg52.h>不會(huì)寫(xiě)#include <stdio.h>呀,但是包含reg52.h條件下也能typedef unsigned char uchar
作者: 董董    時(shí)間: 2019-6-9 16:08
wfy1008 發(fā)表于 2019-6-8 19:57
1)第一個(gè)問(wèn)題,你只要在調(diào)用的文件里include被調(diào)用函數(shù)聲明的頭文件即可
2)是因?yàn)槟阒貜?fù)定義了一個(gè)符 ...

嗯嗯,我也覺(jué)得這是個(gè)很好的解決辦法,多謝指點(diǎn)




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