2015-07-11 96 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