2012-11-22 39 views
4

是否可以通過編程檢測(並打印出)C++頭文件包含在哪裏?如何檢測包含標題的位置從

我有這樣一個標題:

// DeprecatedHeader.h 
__pragma(message ("DeprecatedHeader.h is deprecated - include NewHeader.h instead.")) 
#include "NewHeader.h" 

正如你可以看到,編譯器是MSVC,但我有宏包。 GCC是受歡迎的,但如果不可能的話,我會在Windows上啓用'技巧'。

但是我正在尋找的是像

"AnyOtherFile.cpp was including DeprecatedHeader.h, please include NewHeader.h instead." 

編輯輸出:要清楚爲什麼我要這樣:警告編譯器會引發已經幫助了很多:代碼沒有打破,但捅人們改變包括。問題:它可能會責怪錯誤的「傢伙」,因爲你可以通過另一個頭部拉入這個頭部。我的目標是責怪錯誤的標題,而不是編輯單位。

+0

豈不是可以用做此簡單的文本搜索你的代碼庫? – Philipp

+0

在生成文件之前運行一個腳本將是最簡單的 – enjoylife

+2

一個詞:'/ showincludes'。 http://msdn.microsoft.com/en-us/library/hdkef6tk.aspx – avakar

回答

1

即使我不認爲值得追求這一功能,但這裏有一個解決方案。

在每個頭文件的頂部,檢查棄用頭之後包括其他文件之前,把這個:

#undef INCLUDING_FILE 
#define INCLUDING_FILE "file_name.h" 

這可以用其中的每個.h文件,你寫這一個簡單的bash腳本來完成,包括字符串中的文件名。

所以,你的頭看起來像這樣(用gcc):

普通標題:

#undef INCLUDING_FILE 
#define INCLUDING_FILE "normal.h" 

#include "deprecated.h" 

棄用頭:

#ifdef INCLUDING_FILE 
# pragma message "Internal bug: " INCLUDING_FILE " included " __FILE__ " which is deprecated" 
#else 
# pragma message "Note: you shouldn't included " __FILE__ " which is deprecated" 
#endif 

#undef INCLUDING_FILE 
#define INCLUDING_FILE "normal.h" 

#include "others.h" 
+0

謝謝,我也想過這樣的事情,但這聽起來太費勁了。我認爲現在這樣的警告是可行的最大限度。無論如何感謝解決方案! – Borph

+0

@borph,我也相信這是不值得的麻煩,更不用說相當不合常規了。不要忘記upvote /接受幫助你/回答你的問題的帖子。 – Shahbaz

+0

我試過了,但是它提出了「投票需要15個聲望」 – Borph

2

你可以運行你的編譯器生成預處理源代碼而不是完全編譯的(gcc -E,CL.EXE /E或其他)。最終的代碼將包括標記每個代碼片段的來源。

+0

不完全是我正在尋找 - 請參閱問題中的評論。在我考慮製作預製腳本之前,我會保持原樣 - 警告已經「大聲」,但可以責怪錯誤的人。 – Borph

0

不確定一個確切的解決方案(可能可以使用__FILE__和其他類似的宏),但您可以嘗試將#warning預處理器指令放置到錯誤的頭文件中。在編譯期間,它會發出一個警告,它會通知你想要的任何東西。

+0

__FILE__引用當前文件,我希望會有一個引用「前一個文件」的東西。警告正是我所做的。 – Borph