2010-06-24 53 views
3

我的代碼連接到其他幾個庫,這些庫也是在我的公司開發的,其中一個庫重新定義了errno.h中的幾個值,我希望能夠解決這個問題,但是我無法找到確切的文件那就是重新定義這些值,我想知道是否有一種方法可以讓編譯器在文件定義特定值時告訴我。我怎樣才能讓編譯器告訴我什麼文件#define的值?

+1

你在使用什麼編譯器,因爲我很確定VS2010告訴你誰是罪魁禍首。 – nus 2010-06-24 18:30:44

回答

3

您是否試過使用grep進行搜索?

+0

麻煩的是,如果別的東西被別的東西定義了,它們可能是定義它的邏輯。 – 2010-06-24 19:10:29

5

您可以通過將-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 

這會告訴你你的壞定義在哪裏。

+0

這與我爲解決方案所做的工作非常接近,我最終只是在我的.cpp文件的頂部爭用了定義的值之前,我包含了任何文件,第一個文件定義爲重新定義它和IDE會抱怨那個。 – NSA 2010-07-15 15:47:22

2

如果你不想通過所有的標題爲特定的#define進行搜索,可以在每次的#include後您的源模塊中使用

#undef YOUR_MANIFEST_CONSTANT 

,然後開始從底部移除它們並看看你的定義來自哪裏。

另外,你的編譯器可能會告訴你一個#define已被重新定義。打開所有警告。

0

有些環境,我想IDE在這裏,有可能將配置選項綁定到「項目設置」,而不是使用配置標題。如果您在許多其他開發人員的工作中不會皺眉,那麼您也可以檢查您的工具設置。

大多數編譯器會告訴你問題出在哪裏,你必須查看和思考診斷通知告訴你什麼。 簡而言之,* nix/Windows上的grep/findstr是你的朋友。 如果這樣不會產生任何結果,請檢查構建系統中的工具設置。

2

隨着GCC我做了類似的事情:

g++ input.cc -dD -E > cpp.out 

-dD告訴CPP打印所有定義它們被定義在哪裏。並且在cpp輸出中還有包含文件名和行號的標記。

0

如果右鍵單擊使用並選擇「定義」,則某些IDE將跳轉到正確的位置。

另一個選項,如果你真的卡住了編譯器的命令行選項。大多數編譯器都可以選擇在編譯C++代碼時輸出它們生成的彙編程序。 你可以查看這個彙編器(它有註釋,讓你知道C++源文件中的相對行號)。您不必瞭解彙編程序,但可以看到編譯器運行時使用了什麼值以及包含哪些文件和定義。檢查你的編譯器的文檔,確切地選擇使用