2015-07-11 95 views
-1

我的C代碼中有一個DEBUG宏,但如果我想定義它,我將如何從編譯器執行此操作?我現在用的是gcc編譯器使用以下開關:如何在C中定義DEBUG宏

gcc -ansi -W -Wall -pedantic project.c 

我知道-D開關是用來定義宏但林不知道在哪裏把它。我不知道這是怎麼定義它,當我運行它不顯示任何我的代碼

./a -DDEBUG 

感謝

+0

「我的C代碼中有一個DEBUG宏」 - 什麼代碼?我沒有看到任何代碼。如果你的C代碼中有「DEBUG宏」,那通常意味着你在你的代碼中定義了它,那麼爲什麼你要在命令行上定義呢?您不能在命令行上定義類似功能的宏。但是這個和其他任何迴應都不會很有幫助,因爲*你*沒有太大的幫助,並且讓我們猜測。 –

回答

2

編譯代碼時,您可以使用-D開關:

gcc -ansi -W -Wall -pedantic -DDEBUG project.c 

./a -DDEBUG 

沒有定義DEBUG。它將-DDEBUG作爲參數傳遞給您的main()函數。

2

我想在這裏

./a 

您正在運行在C語言代碼獲得可執行文件。使用調試宏定義選項(如-DDEBUG)調用可執行文件是沒有意義的。這種調試宏定義在編譯時用於選擇要激活或停用的代碼部分,而不是在構建時(對象鏈接時),也不在運行時。

所有類型的宏定義都在編譯之前使用。代碼編譯成目標文件後,宏已經被處理。它們或者通過有定義取代的或經處理的:

#define A 10 
#define SUM(x, y) ((x)+(y)) 
#define DBG 1 
#if defined(DBG) 
    // do some debug operations (printfs, etc.) 
#endif 
int a = A; // a = 10; 
int b = A+1; // b = 11; 
int c = SUM(a, b); // c = ((a)+(b)); 

如果DBG被定義(無論是在源代碼中的#define DBG或#定義DBG 1)調試操作的C代碼被激活,並且編譯成目標文件。如果沒有定義DBG,則調試操作C代碼將從創建的目標文件中刪除。

這就是爲什麼嘗試將調試宏傳遞給可執行文件沒有意義。調用./a -DDEBUG將導致-DDEBUG作爲參數傳遞給可執行文件,並可以在main()函數如下:

int main(int argc, char **argv) 
{ 
    int i; 
    printf("%d %s", argc, argv[0]); 
    for(i=0; i<argc; i++) 
     printf("%s", argv[i]); // first argument is always the name of the execute program 
    return 0; 
} 

要回答你的問題:我不是用gcc專家,但我想你應該將-DDEBUG傳遞給gcc。

4

請仔細閱讀本... http://tigcc.ticalc.org/doc/comopts.html

它建議以下...

-D name 

    Predefine name as a macro, with definition 1. 
當您使用以下

..

gcc -ansi -W -Wall -pedantic -DDEBUG project.c 

這個定義DEBUG是「1 '...然後你可以在代碼中使用以下代碼...

#ifdef DEBUG 

<debug code added here> 

#endif 

最後的想法,我會建議將你的定義重新命名爲不太通用的東西。

+0

'DEBUG'是調試宏的常用名稱,並被許多庫使用。 – Olaf