我有多個頭文件,它們每個都必須在數組中附加一個數字來註冊它的函數。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
我不認爲這是可能的。如果您願意,可以參考以下替代方法:http://stackoverflow.com/a/4152185/182748 – asveikau
使陣列比您需要的大。 –
'我有多個頭文件,每個頭文件都必須在數組中附加一個數字來註冊它的函數。' 這就是問題出在哪裏,這是糟糕的程序設計。在面向對象的設計中,每個模塊應該是自治的,儘可能少的依賴關係。我不知道你的「寄存器」應該是什麼,所以很難提出最好的程序設計,但是由於寄存器顯然是相互關聯的,它們應該由一個模塊來處理。如果需要,寄存器模塊可以包含在所有這些頭文件中。 – Lundin