2012-09-24 68 views
2

我開發了一個使用MindTree藍牙SDK的嵌入式應用程序。c頭文件中的靜態struct聲明和初始化

我有一個頭文件如下:

typedef struct { 
    UCHAR outputDir; 
    UCHAR reset; 
    UCHAR nack; 
    UCHAR startCondition; 
    UCHAR stopCondition; 
    UCHAR busy; 
} USCI_ConfigurationFlags; 

static USCI_ConfigurationFlags usciConfigFlags = { UCTR, UCSWRST, UCNACKIFG, UCTXSTT, UCTXSTP, UCBBUSY }; 

兩個.c文件後來包括我上面的標題,並使用在不同場合usciConfigFlags有時從中斷之內。

這合法嗎?

我試圖瞭解在SDK中調用BT_bluetooth_on方法後,爲什麼(以及它是否與問題相關)結構體的值在運行時更改。

謝謝, 亞當。

回答

8

static這裏並不意味着你的想法。這意味着聲明和變量只能在一個編譯單元中可見。也就是說,您有兩個獨立的usciConfigFlags實例。

如果您想要一個全局變量,您需要使用extern而不是static,並在您的一個c文件中使用初始值進行實際聲明(沒有extern)。

另外,如果沒有適當的鎖定,更改結構中的值也會感到厭倦。只讀併發訪問通常很好。

+0

是的,我傾向於考慮在.h頭文件中初始化全局值是一個壞主意。 – Gilbert

1

在兩個.c文件中包含標題沒有問題。 static修飾符限制文件中變量的可訪問範圍,僅包括標題。兩個usciConfigFlags在兩個不同的文件中是不完全相同的。

另外static並不意味着不變。因此,您可以以任何您想要的方式修改結構的值。

以下是從wikipedia

在計算機程序中,靜態變量是一個已經 靜態分配的變量 - 其壽命跨越 該程序的整個運行延伸。這與變量(局部變量)相比更短暫的自動 ,其存儲被分配並且 在調用堆棧上解除分配;與其動態分配存儲的對象相反。

1

前面加上一個static關鍵字可變使其可見只是在當前轉換單元(即,如果函數內,只有功能,並且如果在一個文件中,只有文件)。

在頭文件中定義一個變量永遠不是一個好主意。即使您需要兩個具有相同名稱的不同文件中的兩個靜態變量,最好還是放入.c文件本身,因爲它有助於更​​好地維護和可讀性,因爲您將清楚其中實際存在的所有文件以及正在使用。

如果將其添加到頭文件中,則在稍後的時間點,如果其他.c文件包含此頭文件,則該變量將包含在該翻譯單元中。

Epsalon建議您可以考慮其他優點。