我的代碼連接到其他幾個庫,這些庫也是在我的公司開發的,其中一個庫重新定義了errno.h中的幾個值,我希望能夠解決這個問題,但是我無法找到確切的文件那就是重新定義這些值,我想知道是否有一種方法可以讓編譯器在文件定義特定值時告訴我。我怎樣才能讓編譯器告訴我什麼文件#define的值?
回答
您可以通過將-include errno.h
添加到構建相關庫的命令行來實現。這是一個簡單的例子。我有一個名爲 「file.c」 C程序:
#define ESRCH 8
這就是它 - 然後我編譯:
cc -c -include errno.h file.c
而且急,編譯器警告:
file.c:1:1: warning: "ESRCH" redefined
In file included from /usr/include/errno.h:23,
from <command-line>:0:
/usr/include/sys/errno.h:84:1: warning: this is the location of the previous definition
這會告訴你你的壞定義在哪裏。
這與我爲解決方案所做的工作非常接近,我最終只是在我的.cpp文件的頂部爭用了定義的值之前,我包含了任何文件,第一個文件定義爲重新定義它和IDE會抱怨那個。 – NSA 2010-07-15 15:47:22
如果你不想通過所有的標題爲特定的#define進行搜索,可以在每次的#include後您的源模塊中使用
#undef YOUR_MANIFEST_CONSTANT
,然後開始從底部移除它們並看看你的定義來自哪裏。
另外,你的編譯器可能會告訴你一個#define已被重新定義。打開所有警告。
有些環境,我想IDE在這裏,有可能將配置選項綁定到「項目設置」,而不是使用配置標題。如果您在許多其他開發人員的工作中不會皺眉,那麼您也可以檢查您的工具設置。
大多數編譯器會告訴你問題出在哪裏,你必須查看和思考診斷通知告訴你什麼。 簡而言之,* nix/Windows上的grep/findstr是你的朋友。 如果這樣不會產生任何結果,請檢查構建系統中的工具設置。
隨着GCC我做了類似的事情:
g++ input.cc -dD -E > cpp.out
-dD告訴CPP打印所有定義它們被定義在哪裏。並且在cpp輸出中還有包含文件名和行號的標記。
如果右鍵單擊使用並選擇「定義」,則某些IDE將跳轉到正確的位置。
另一個選項,如果你真的卡住了編譯器的命令行選項。大多數編譯器都可以選擇在編譯C++代碼時輸出它們生成的彙編程序。 你可以查看這個彙編器(它有註釋,讓你知道C++源文件中的相對行號)。您不必瞭解彙編程序,但可以看到編譯器運行時使用了什麼值以及包含哪些文件和定義。檢查你的編譯器的文檔,確切地選擇使用
- 1. 怎樣告訴C編譯器不重疊我的琴絃
- 2. Angular2:我怎樣纔能有一個父組件告訴孩子什麼大小?
- 3. Android:我怎樣才能告訴某個活動從服務中做些什麼?
- 4. 我怎樣才能告訴JavaScript在最大寬度後執行
- 5. 我怎樣才能給Intellij編譯器更多的堆空間?
- 6. 我怎麼能告訴角不使用$當編譯子節點編譯
- 7. 我怎樣才能的application.ini文件
- 8. 我怎樣才能讓由編碼器工具包被別人
- 9. 我怎樣才能
- 10. OMNET ++/MIXIM:我怎樣才能更正以下編譯器錯誤
- 11. 我怎樣才能'編譯'不同的文件到一個文件在c + +
- 12. 我怎樣才能讓在裝配
- 13. 我怎樣才能讓CSS動畫
- 14. 我怎樣才能讓側邊欄
- 15. 我怎樣才能讓它幹?
- 16. 我怎樣才能讓吐司消失?
- 17. 我怎樣才能讓課程「重設」?
- 18. 我怎樣才能讓深性質
- 19. 我怎樣才能讓貓殼循環?
- 20. 我怎樣才能讓-drawRect執行?
- 21. 我怎樣才能讓$ routeProvider在angularjs
- 22. 我怎樣才能讓這個更好
- 23. 我怎樣才能讓StackPanel使用ItemTemplate?
- 24. 我怎樣才能讓joomla3.x
- 25. 我怎樣才能讓FxCop壓制整個類型的警告?
- 26. 我怎樣才能讓WordPress的WPML非翻譯職位?
- 27. 我怎樣才能看到sdf文件
- 28. 我怎樣才能從PSD文件
- 29. 我怎樣才能讓一個孩子的XML文件
- 30. 誰能告訴我如何編譯webkitdotnet
你在使用什麼編譯器,因爲我很確定VS2010告訴你誰是罪魁禍首。 – nus 2010-06-24 18:30:44