2012-08-03 26 views
0

我有兩個C模塊,每個使用另一個的功能。在我的makefile我已經表達了這樣的這樣的:在make/C代碼中解析循環引用的正確方法?

moduleA.h: common.h moduleB.h 
moduleB.h: common.h moduleA.h 

出於顯而易見的原因,雖然它繼續編譯罰款這會產生一個循環引用警告。解決這個問題的正確方法是什麼?我應該重構模塊來創建第三個模塊 - 將兩者聯繫在一起嗎?

模塊A是一個日誌模塊,模塊B是一個cronjob實現。日誌記錄使用cronjob來安排日誌輪轉,而cronjob使用日誌記錄來告訴每個人它所要做的事情。

模塊C會比較小;只需創建一個cronjob來調用日誌輪轉函數,但是日誌記錄不需要知道cronjob。 Cronjob仍然會依賴於日誌記錄。

或者我應該忽略這個警告?

+1

包括後衛:http://en.wikipedia.org/wiki/Include_guard – tbert 2012-08-03 16:11:30

+1

我總是創建一個新的頭文件的時候有兩個頭文件分享的內容(結構聲明,例如),所以您的建議創建** moduleC.h **很好。 – Claudix 2012-08-03 16:24:27

+0

假設'moduleA.h'已經改變。應該如何重建'moduleB.h'? – Beta 2012-08-03 17:30:00

回答

0

您可以使用舒緩這樣的:

#ifndef MY_HEADER_FILE_H 
#define MY_HEADER_FILE_H 

/* Prototypes and others consts and .... */ 

#endif 

希望這有助於。

問候。

+0

謝謝(還有tbert),但我的問題只在makefile中。根據您的示例,我總是在包含文件中使用警衛。 – jrichemont 2012-08-03 17:17:37

0

您應該創建日誌記錄模塊moduleA的一個版本,只記錄日誌而不必擔心cron作業。然後創建一個新模塊(可能是moduleC),它只涉及使用cron作業來旋轉日誌。然後你的依賴爲非圓形:

moduleC -> moduleB -> moduleA 
+0

謝謝;我認爲這可能會成爲多數意見,但想把它扔出去 – jrichemont 2012-08-04 17:43:43

0

是錯誤的陳述一個頭文件作爲目標的頭文件的一個先決條件,除非目標是要翻拍取決於先決條件。通常,目標文件目標取決於頭文件,例如, G。

moduleA.o moduleB.o: common.h moduleA.h moduleB.h 
+0

我相信這是真的。我打算像「如果a取決於b和b取決於c,d,e和f,那麼改變f應該重建一個」_even_ _if,但沒有什麼可以重建b。 – jrichemont 2014-05-07 16:29:03

+0

在這種情況下,我只是使用規則'b:c d e f;觸摸b'。 – Armali 2014-05-08 06:40:06