我的C代码中有一个DEBUG宏,但如果我想定义它,我将如何从编译器执行此操作?我现在用的是gcc编译器使用以下开关:如何在C中定义DEBUG宏
gcc -ansi -W -Wall -pedantic project.c
我知道-D开关是用来定义宏但林不知道在哪里把它。我不知道这是怎么定义它,当我运行它不显示任何我的代码
./a -DDEBUG
感谢
我的C代码中有一个DEBUG宏,但如果我想定义它,我将如何从编译器执行此操作?我现在用的是gcc编译器使用以下开关:如何在C中定义DEBUG宏
gcc -ansi -W -Wall -pedantic project.c
我知道-D开关是用来定义宏但林不知道在哪里把它。我不知道这是怎么定义它,当我运行它不显示任何我的代码
./a -DDEBUG
感谢
编译代码时,您可以使用-D
开关:
gcc -ansi -W -Wall -pedantic -DDEBUG project.c
这
./a -DDEBUG
没有定义DEBUG
。它将-DDEBUG
作为参数传递给您的main()
函数。
我想在这里
./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。
请仔细阅读本... 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
最后的想法,我会建议将你的定义重新命名为不太通用的东西。
'DEBUG'是调试宏的常用名称,并被许多库使用。 – Olaf
“我的C代码中有一个DEBUG宏” - 什么代码?我没有看到任何代码。如果你的C代码中有“DEBUG宏”,那通常意味着你在你的代码中定义了它,那么为什么你要在命令行上定义呢?您不能在命令行上定义类似功能的宏。但是这个和其他任何回应都不会很有帮助,因为*你*没有太大的帮助,并且让我们猜测。 –