2013-03-07 94 views
1

好吧,我明白外部定義是如何工作的,但我不知道什麼是放置它們的「最佳」地方。請看下面的文件結構:C + extern聲明 - 把它們放在哪裏

  • 的main.c/main.h/global.h
  • drv_adc.c/drv_adc.h
  • drv_pwm.c/drv_pwm.h

你可能會猜測,這對於一個小型微控制器來說非常普遍。這兩個驅動程序在硬件的不同部分上工作,並且沒有相互依賴關係。兩個驅動程序都可以設置一個標誌(例如:adc_irq_occured,pwm_irq_occured),它表示發生了什麼事情,哪些會在main.c中處理。

現在我可以想到兩種方法,我會把「extern bool adc_irq_occured;」旗。

  • 的drv_adc.h:它有點屬於ADC驅動器,所以我可以將其添加到它的頭文件,並在main.c中對其進行實例化
  • 我打開邏輯並將extern聲明放入我的main.h(或global.h,如果必須如此)並在我的drv_adc.c中實例化它。

現在的問題:哪個選項是首選的選項?有沒有我可以閱讀這些主題的好書?

回答

1
In main.c: 
int flag = 0; 

In main.h: 
extern int myGlobal; 


In drv_adc.c: 
#include "main.h" 

In drv_pwm.c: 
#include "main.h" 

現在這個變量是全球性的,它是不太安全,因此需謹慎使用,並確保任何其他DRV文件不會亂動。編輯 - 爲什麼不能相反呢?

我們把extern聲明在你的其他文件中包含的頭文件中。這是因爲我們有一次聲明它告訴編譯器只有標誌變量的一個通用版本可用於我們包含在標題中的drv文件,爲了更加清晰,請閱讀本討論Difference between putting variables in header vs putting variables in source

+0

爲什麼不這樣做呢? – 2013-03-08 14:45:52

+0

@TomL。 ,已編輯我的帖子,以消除我給你的其他荒謬建議,也包括了對你的評論的回答 – 2013-03-08 15:52:48

+0

是的,這是故事的一點。然而,想象一下:駕駛員彼此獨立,彼此不需要了解對方。我只想讓「main.c」知道他們兩個,但不是彼此之間。那麼,其他方式是不是更有意義(因爲它將範圍限制得更多一些?) – 2013-03-08 16:17:09