用gcc 的-D 参数来调试代码

原创 2011年01月13日 10:25:00

用gcc 的-D 参数来调试代码

关键词gcc    -Dmacro    调试                                          

写代码免不了要加入调试信息,在程序头定义一个DEUBG开关很烦,不过gcc早就想到了,有-D选项。
man gcc
或者
man gcc | col -b > gcc.txt
相关信息如下:
GCC(1)                               GNU                               GCC(1)



NAME
       gcc - GNU project C and C++ compiler

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] infile...

       Only the most useful options are listed here; see below for the
       remainder.  g++ accepts mostly the same options as gcc.

-----------------------

       Preprocessor Options
           -Aquestion=answer -A-question[=answer] -C  -dD  -dI  -dM  -dN
           -Dmacro[=defn]  -E  -H -idirafter dir -include file  -imacros file
           -iprefix file  -iwithprefix dir -iwithprefixbefore dir  -isystem
           dir -M  -MM  -MF  -MG  -MP  -MQ  -MT  -nostdinc -P  -fwork-
           ing-directory  -remap -trigraphs  -undef  -Umacro  -Wp,option
           -Xpreprocessor option
----------------------
       -D name
           Predefine name as a macro, with definition 1.

       -D name=definition
           Predefine name as a macro, with definition definition.  The con-
           tents of definition are tokenized and processed as if they
           appeared during translation phase three in a #define directive.
           In particular, the definition will be truncated by embedded new-
           line characters.

           If you are invoking the preprocessor from a shell or shell-like
           program you may need to use the shell's quoting syntax to protect
           characters such as spaces that have a meaning in the shell syntax.

           If you wish to define a function-like macro on the command line,
           write its argument list with surrounding parentheses before the
           equals sign (if any).  Parentheses are meaningful to most shells,
           so you will need to quote the option.  With sh and csh,
           -D'name(args...)=definition' works.

           -D and -U options are processed in the order they are given on the
           command line.  All -imacros file and -include file options are
           processed after all -D and -U options.


       -U name
           Cancel any previous definition of name, either built in or pro-
           vided with a -D option.
-----------------------------------
 -D 定义宏(D-define)

-D定义宏有两种情况,一种是-DMACRO 相当于程序中使用#define MACRO 另外可以-DMACRO=A 相当于程序中使用#define MACRO A 这只是一个编绎参数,在连接时没有意义
如: $gcc -c hello.c -o hello.o -DDEBUG
上面为hello.c定义了一个DEBUG宏,某些情况下使用-D 代替直接在文件中使用#define,也是为了避免修改源代码双。例如一个程序希望在开发调试的时候能打印出调试信息,而正式发布的时候就不用打印了,而且发布前不用修改源代码双。可以这样
#ifdefine DEBUG
printf("debug message/n");
#endif
对于这段代码,平时调试的时候就加上-DDEBUG 发布时不用-D选项
与之对应的是-UMACRO参数,相当于#undef MACRO,取消宏定义

============hello.c======
#include <stdio.h>
#include <stdlib.h>

int main()
{
#ifdef DEBUG
        printf("this is before/n");
#endif
        printf("helloworld/n");
#ifdef DEBUG
        printf("this is end/n");
#endif
        exit(0);
}

$gcc -c hello.c -o hello.o -DDEBUG -Wall
则./hello输出:
this is before
helloworld
this is end

$gcc -c hello.c -o hello.o -Wall
则./hello输出:
helloworld

方便!

相关文章推荐

GCC -L-l -D -I 参数的用法

(1)-l参数和-L 参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,...

Linux系统中使用GCC CPU参数优化代码编译

结构体型的参数和返回值的C函数, GCC如何生成代码?

C代码与汇编代码有一点差别很大,即汇编语言程序设计中,各种数据类型之间的差别很小.汇编语言并没有提供诸如C语言结构体的抽象,它只是将C语言的结构体看成一个一个的元素.   本文探讨对于函数的参数和...

使用libdwraf写的一个读取GCC -g参数编译生成的调试信息的例子

唉,当初怎么就选择用libdwarf做了  艹。做完发现它远没BFD好用。。。 只处理了标准C 在X86下有可能碰到的变量和其作用范围(就是函数和局部块的范围)  其他的   用不到 不关心...

g++/gcc编译参数 和 gdb常用调试命令

gcc[option|filename ]... g++[option|filename ]... 描述(DESCRIPTION) 1.预处理,生成.i的文件[预处理器cpp] 2.将预处...

GCC的一些参数介绍、gdb遇到段错误的一般调试方法

转自:http://www.w3china.org/blog/more.asp?name=FoxWolf&id=36746FoxWolf 发表于 2008-6-11 17:55:10 在为Linux开...

使用gdb调试程序详解和GCC参数详解

熟练使用gdb是一个linux下开发人员必备的一项技能,我们由浅入深的学习一下gdb的强大功能。 一.gdb简单介绍 名称     gdb - GNU Debugger 提要     gdb...
  • doc_sgl
  • doc_sgl
  • 2013年12月11日 21:35
  • 3805

Unity3D之打开Activity与调用JAVA代码传递参数

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序。而...

Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序。而...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用gcc 的-D 参数来调试代码
举报原因:
原因补充:

(最多只允许输入30个字)