GCC支持宏定义

gcc -Dmacro,将macro定义为1,我们可以利用这点在我们的代码中加入宏定义开关。

#ifdef DEBUG
#define pdebug(format, args...) fprintf(stderr, format, ##args)
#else
#define pdebug(format, args...) syslog(LOG_ERR, format, ##args)
#endif

这里,如果可变参数被忽略或为空,‘##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号。即将两个相邻的标记(token)连接为一个单独的标记。这里就支持了可变参数了,如果你在宏调用时,确实提供了一些可变参数,GNU CPP也会工作正常,它会把这些可变参数放到逗号的后面。

当定义了DEBUG时,此时会将打印信息打印到标准输出,我们便可以根据信息进行调试了。如果没有定义DEBUG,此时会将信息写到系统日志文件,前提是我们包含了<syslog.h>这个头文件。当然了我们也可以pdebug()定义为空,这样就不会打印任何信息了。

下面是我们的测试代码:

 #include <stdio.h>
#include <syslog.h> #ifdef DEBUG
#define pdebug(format, args...) fprintf(stderr, format, ##args)
#else
#define pdebug(format, args...) syslog(LOG_ERR, format, ##args)
#endif int main()
{
openlog("Controlagent",LOG_NDELAY,LOG_USER);
pdebug("if you see this is shell ,then it comes from stderr");
return ;
}

我们是用gcc -DDEBUG test.c -o test编译我们的文件,执行可执行文件,就可以打印出信息了:

if you see this is shell ,then it comes from stderr

而如果我们使用gcc test.c -o test编译,执行时是看不到任何输出信息的。

为了便于较大项目的管理,我们肯定要使用make,我们可以在makefile文件中指定条件编译

CC = gcc

INCLUDE = .

DEBUG = y

ifeq ($(DEBUG),y)
DEBFLAGS = -O -g -DDEBUG
else
DEBFLAGS = -O2
endif CFLAGAS += $(DEBFLAGS) test:test.o
$(CC) -o test test.o test.o:test.c
$(CC) -I$(INCLUDE) $(CFLAGS) -c test.c
clean:
   rm -f *.o test

这样,我们就可以通过控制DEBUG项来进行条件编译啦,方便快捷。

Linux下C编程通过宏定义打开和关闭调试信息的更多相关文章

  1. Linux 下IOport编程訪问

    曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...

  2. linux 下 poll 编程

    poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...

  3. linux下libnet编程 亲自测试可用

    linux下libnet编程 亲自测试可用 亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD    IPv6 0x86e ...

  4. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  5. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  6. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  7. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  8. (转)SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开?

    SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开? 原文:http://blog.csdn.net/hhcccchh/article/details/12995539 SELin ...

  9. Linux下安装mysql5.6.11(找点有用的信息太费劲)(转)

    Linux下安装mysql5.6.11(找点有用的信息太费劲) (2013-04-25 10:25:09)     1.申请阿里云Linux服务器 昨天在阿里云申请了一个免费试用5天的Linux云服务 ...

随机推荐

  1. android开发SDcard 响应的文件相关处理(一)

    android开发相关文件类的处理工具类: package com.gzcivil.utils; import java.io.File; import java.util.ArrayList; im ...

  2. oracle查看系统资源占用情况

    1,连上服务器,使用top命令,可以查看cpu使用率以及内存的使用情况等等,还有当前各用户的使用情况 2,用pl/sql developper,tool里面选sessions,就可以看到当前sessi ...

  3. ftp上来显示的时间和系统时间不一致

    ftp上来显示的时间和系统时间不一致,是因为默认情况下,vsftpd 是用GMT做为他的时间的,所以和系统的时间可能会不一致 修改也非常简单: vi /etc/vsftpd/vsftpd.conf 在 ...

  4. Linux学习之nfs实例

    在对exports文件进行了正确的配置后,就可以启动NFS服务器了. 1.启动NFS服务器 为了使NFS服务器能正常工作,需要启动portmap和nfs两个服务,并且portmap一定要先于nfs启动 ...

  5. C#学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现

    首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的 ...

  6. AndroidManifest.xml配置文件详解

    AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xm ...

  7. linux文件名乱码解决办法

    1.linux解压压缩文件乱码 unzip -O CP936 xxx.zip 2.一般文件用convmv sudo convmv -f gbk -t utf-8 -r --notest /your_d ...

  8. Built-in Functions学习

    abs(x) :返回一个数字的绝对值,可以是整形也可以是浮点型. all(iterable):返回True,如果所以迭代对象的元素为true,或者可迭代对象为空. any(iterable):如果可迭 ...

  9. MarkWord

    MarkWord - 可发布博客的 Markdown编辑器 代码开源 1 /// <summary> 2 /// 同步呈现 3 /// </summary> 4 /// < ...

  10. COB (Chip On Board) 製程介紹/簡介/注意事項 I

    COB (Chip On Board)在電子製造業並不是一項新鮮的技術,但最近我卻常常被問到相關的問題及資料索取.也許真的是產品越來越小了,而較進階的技術又太貴,所以又有人回過頭來考慮COB的製程. ...