如何在C中定义DEBUG宏

时间:2015-07-11 21:14:34

标签: c macros ansi

我的C代码中有一个DEBUG宏,但如果我想定义它,我将如何从编译器中执行此操作?我正在使用带有以下开关的gcc编译器:

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

我知道-D开关用于定义宏但我不知道放在哪里。我不确定这是否如何定义它,它在我运行我的代码时不会显示任何内容

./a -DDEBUG 

谢谢

3 个答案:

答案 0 :(得分:5)

请阅读此内容...... http://tigcc.ticalc.org/doc/comopts.html

它建议以下......

npm install grunt-contrib-watch --save-dev

使用以下内容时..

-D name

    Predefine name as a macro, with definition 1. 

这将DEBUG定义为'1'...然后您可以在代码中使用以下内容...

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

最后的想法,我建议将你的定义重命名为不那么通用的东西。

答案 1 :(得分:2)

编译代码时使用-D开关:

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

./a -DDEBUG 

未定义DEBUG。它将-DDEBUG作为参数传递给您的main()函数。

答案 2 :(得分: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或#define 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。