2011-06-14 103 views
4

我正在學習有條件編譯,我認爲迄今爲止我理解得很好。現在,如果我的代碼:gcc條件編譯

#ifdef UMP_TO_FILE 
    //do something here... 
#endif 

,我跑:

gcc myprogram.c -DUMP_TO_FILE 

然後,代碼塊 「//做的東西在這裏......」 被編譯。現在,我的問題是:

什麼是-DUMP_TO_FILE標誌呢?

我認爲這個標誌是「-D」,它定義了宏「UMP_TO_FILE」,但我想確定語法,「gcc --help」不會告訴我任何關於這個的東西,也許我不會不知道如何在互聯網上搜索這個!

非常感謝您分享您的知識!

+0

我給你一個快速的回答..無論如何@安德魯懷特是正確的。請在再次詢問之前開始接受一些答案。 – Heisenbug 2011-06-14 01:50:09

+0

露西,在您不知道安德魯和0verbose正在談論什麼的情況下,您最好滿足您的要求的答案可以通過在空的綠色標記上打勾來接受他們的左邊。回顧你的舊問題是一個好主意,如果任何答案足夠好,就這樣做。它會說服一些人更容易回答未來的問題 - 當然不是我,我只是爲了有機會將我的觀點強加給別人,即使花費我錢,我也可能會這樣做:-) – paxdiablo 2011-06-14 02:03:52

回答

2
-D UMP_TO_FILE 

定義宏值UMP_TO_FILE。 這就像把你的下面的代碼行:

#define UMP_TO_FILE 

如果值(UMP_TO_FILE)的定義是,在中的#ifdef之間的代碼行和#endif將被編譯。否則不是。

2

-d定義了一個符號。我相信大多數編譯器也會允許爲符號賦值,如-dfoo=bar爲foo符號賦值。

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options

-D名 預定義名稱作爲一個宏,以定義1.

-D名稱=定義 定義的內容被標記化和處理,如同它們在翻譯相三出現在`#define'指令中。特別是,定義將被嵌入的換行符截斷。 如果您從shell或類似shell的程序中調用預處理器,則可能需要使用shell的引用語法來保護shell語法中具有含義的空格等字符。

如果您希望在命令行中定義類似函數的宏,請在等號(如果有)之前將其參數列表與周圍的圓括號一起寫入。圓括號對大多數炮彈都有意義,所以你需要引用這個選項。用sh和csh,-D'name(args ...)= definition'作品。

-D和-U選項按照它們在命令行上給出的順序進行處理。所有-imacros文件和-include文件選項都在-D和-U選項之後進行處理。

6

man gcc輸出包含此小片段:

-D名稱

name預定義爲一個宏,以定義1。

-D名稱=定義

定義的內容被標記化和處理,如同它們在#define指令期間平移相三出現了。特別是,定義將被嵌入的換行符截斷。

如果您從shell或類似shell的程序中調用預處理器,則可能需要使用shell的引用語法來保護字符,例如在shell語法中有意義的空格。

如果您希望在命令行中定義類似函數的宏,請在等號(如果有)之前將其參數列表與周圍的圓括號一起寫入。圓括號對大多數炮彈都有意義,所以你需要引用這個選項。用shcsh,-D'name(args...)=definition'工作。

-D-U選項按照它們在命令行上的順序進行處理。所有-imacros文件和-include文件選項均在處理全部-D-U選項後處理。

所以,選項-DUMP_TO_FILE相當於把線#define UMP_TO_FILE 1在源代碼(有細微的差別,但沒有必要在這裏介紹它們)。


另外,我認爲這是一個相當糟糕的做法。作者正在執行詭計,因此它看起來像編譯器選項DUMP_TO_FILE而不是預處理器宏。這有點聰明,但是對於那些想知道UMP_TO_FILE究竟意味着什麼的人來說,這會造成麻煩。

就個人而言,我寧願看到-DDUMP_TO_FILE#ifdef DUMP_TO_FILE,因爲它意圖更清晰。