2012-11-08 47 views
0

我正在開發一個比我習慣的項目更大的項目,我正在盡我所能讓我的代碼結構合理。我正在編程一個微控制器,並且有一些全局變量,根據我在這裏讀到的一些建議,所有的變量都被定義在一個「global_variables.h」文件中,該變量包含在使用全局變量的任何地方。你應該在哪裏放置「typedef枚舉」在你的源代碼中?

我也把全局變量的typedef放到「global_variables.h」文件中。

我遇到的問題是我使用全局變量的file1.c有一個function1(new_type_t變量),它接受新的typedef作爲參數。問題在於我在頭文件(file1.h)中定義了function1原型,但由於#include「global_variables.h」位於file1.c中,因此file1.h中的函數原型沒有看到typedef 。

我覺得這很常見,但谷歌似乎沒有提供太多的幫助。我應該製作一個單獨的「global_variables.h」和「global_variables_types.h」,並將.h文件包含在我的其他文件的頭文件和源代碼中的.c文件中?

+0

你只需要在file1.h中包含'#include「global_variables.h」''。 –

+0

我認爲他建議的分割方式更靈活一些,因爲它會導致更小的構建塊,可以這麼說。 – Dabbler

+0

你的項目有多大?整體規模是1KLOC(源代碼行數千),10KLOC,100KLOC? –

回答

4

我不認爲有頭文件global_variables.h是明智的。

如果您的項目是一個小型的單人項目(例如少於50KLOC = 5萬行源代碼),並且您不打算構建可重用的庫,那麼對於所有項目都有一個單獨的頭文件可能是明智的。該頭文件將聲明全局變量,並在它們之前的相關類型。您還將聲明所有函數,並最終定義所有內聯函數。你可以考慮在一個單獨的頭文件中包含內聯函數(包括你的主頭文件)。

如果您打算製作可重用的代碼,請爲項目的單獨子系統製作單獨的標頭。但我不覺得需要爲所有全局變量設置一個頭部。

最重要的是,保持您的全局變量集最小。您應該能夠用單手的手指統計全局變量。如果您需要超過4個或5個全局變量,請考慮在全局struct中打包相關的全局變量。舉例來說,如果屏幕尺寸是全球數據,不聲明int screen_width, screen_height;而是

struct { 
    int width; 
    int height; 
} screen; 

當然,真正的東西取決於項目,也許在構建鏈。一些專有的編譯器並不真正優化,如果使用全局結構,可能會產生錯誤的代碼。如果你使用最近的GCC(作爲交叉編譯器,最好在Linux上),你不會有這個問題,因爲GCC優化得很好。始終讓你的編譯器的所有警告(例如用gcc -Wall -g -O2建)

一個很好的建議是研究的一些源代碼的現有免費軟件與你相似。

4

有一對夫婦的頭文件,使事情順利進行的重要規則.. \

首先,用頭警衛,使多個列入不會造成問題。現在

module.h中中

...

#ifndef MODULE_H 
    #define MODULE_H 
    ... 
    #endif 

,如果包括相同的頭兩次不要緊。

第二條規則(現在你有標題守護)是每個.h文件應該包含所有需要編譯的其他文件。當你這樣做時,你的代碼在重用另一個模塊中的一個頭文件方面更加健壯,並且正確地獲取頭文件的順序。

#ifndef MODULE_H 
    #define MODULE_H 

    #include "module2.h" // we need a type from here. 

    void myFunc(Module2Type t); 
    #endif 
1

一個選項是在file1.h中包含global_variables.h而不是file1.c。這是否是一個好的解決方案,取決於你的源代碼樹。

1

一個常見而靈活的方法是用.h與extern連接聲明全局變量。然後在您選擇的.c文件中定義全局變量。

在你需要引用全局變量的地方包括.h。鏈接器將負責解決對相應的.obj文件的引用。

事實上,全球化程度越低,追蹤誰使用它們的能力越強。

相關問題