2013-05-27 27 views
5

我有多個頭文件,它們每個都必須在數組中附加一個數字來註冊它的函數。C追加到頭文件中的數組

目前我在每個頭文件中都有一個唯一名稱的函數,在程序文件中我需要在一個合併函數中調用所有這些函數。

int register1() { return 100; }; //in header1.h 
int register2() { return 200; }; //in header2.h 
int register3() { return 300; }; //in header3.h 
int register4() { return 400; }; //in header4.h 
int registered[] = {register1(),register2(),register3(),register4()}; //main.c 

但是這很不方便,因爲我需要在兩個地方修改時添加或刪除頭文件。最好只修改頭文件。我在想一個預處理定義,所以在每個標題我就可以使用類似:

#define Registered Registered,100 // header1.h 
#define Registered Registered,200 // header2.h 
int registered[] = {Registered}; // main.c 

但是,這當然不會編譯,因爲新的定義重新定義舊的。那麼有沒有辦法追加一個定義?或以其他方式將數字附加到數組而不修改兩個文件?

這是C,而不是C++,否則我會使用帶有構造函數的類實例來寫入數組。 Somethink這樣的:

struct __header1{ __header1() { 
    global_array[global_array_ptr++] = 100; 
} } __header1_inst; 

,然後將其轉換爲一個不錯的宏:

#define register(hdr, func) struct __header##hdr{ __header##hdr() { \ 
     global_array[global_array_ptr++] = func; \ 
    } } __header##hdr##_inst; 

    register(1, 100) // header1.h 
    register(2, 200) // header2.h 
+0

我不認爲這是可能的。如果您願意,可以參考以下替代方法:http://stackoverflow.com/a/4152185/182748 – asveikau

+0

使陣列比您需要的大。 –

+1

'我有多個頭文件,每個頭文件都必須在數組中附加一個數字來註冊它的函數。' 這就是問題出在哪裏,這是糟糕的程序設計。在面向對象的設計中,每個模塊應該是自治的,儘可能少的依賴關係。我不知道你的「寄存器」應該是什麼,所以很難提出最好的程序設計,但是由於寄存器顯然是相互關聯的,它們應該由一個模塊來處理。如果需要,寄存器模塊可以包含在所有這些頭文件中。 – Lundin

回答

1

恕我直言,這是一個黑客,我會建議反對。即使你可以在C中做到這一點,考慮一個這樣的頭文件被幾個模塊包含的情況。每個這樣的模塊在全局數組中都會有相同的條目。接下來,儘管可以用C++來完成,但全局對象初始化的順序爲is undefined,因此依賴全局數組內容的另一個全局對象的初始化將不可靠。

此外,這是一個非常複雜的方式來做一件簡單的事情,並且相當模糊了它的含義。除了數組填充代碼本身很複雜之外,當依賴關係變得微不足道時,跟蹤包括將變得繁重。所以,只需將該全局數組明確地填充到特定位置即可。