Linux下C编程通过宏定义打开和关闭调试信息
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编程通过宏定义打开和关闭调试信息的更多相关文章
- Linux 下IOport编程訪问
曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...
- linux 下 poll 编程
poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...
- linux下libnet编程 亲自测试可用
linux下libnet编程 亲自测试可用 亲自测试 如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD IPv6 0x86e ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- Linux 下shell 编程学习脚手架
linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...
- (转)SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开?
SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开? 原文:http://blog.csdn.net/hhcccchh/article/details/12995539 SELin ...
- Linux下安装mysql5.6.11(找点有用的信息太费劲)(转)
Linux下安装mysql5.6.11(找点有用的信息太费劲) (2013-04-25 10:25:09) 1.申请阿里云Linux服务器 昨天在阿里云申请了一个免费试用5天的Linux云服务 ...
随机推荐
- iOS 网络请求——post请求
-(void)postRequest{ NSString *urlString = [NSString stringWithFormat:@"http://f1.netgears.cn:80 ...
- C#委托,事件,匿名委托
作为一个初学者,写下来是当做自己的学习笔记,希望在以后遇到问题的时候能够快速的找到方法 如果能帮助跟我一样的新人是更好不过的了 如果有什么不正确或者可以改进的地方也希望大家能够指出来 ...
- iframe自适应高度的问题
最近工作中遇到了iframe自适应高度的问题. 如果在iframe中写定高度height的属性,并且iframe中内容高度小于给定的height时,会在手机浏览器中莫名的产生下拉框,造成体验度下降. ...
- spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException
14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [myba ...
- vb 添加状态栏
1.新建一工程2.添加"部件" ms windows common controls 6.03.将StatusBar控件加至窗体中4.右键点击该控件,选"属性" ...
- J2SE知识点摘记(九)
1. 线程操作的一些方法 方法名称 方法说明 public static int activeCount() 返回线程组中目前活动的线 ...
- Windows 7 with SP1简体中文旗舰版(微软MSDN原版)+ 激活密钥
在Windows 7六个版本中,旗舰版和企业版功能性能完全一样,同属诸版本之中的最高版本.现提供Windows 7 with SP1简体中文旗舰版(微软MSDN最新原版)+ 激活密钥如下: 32位版本 ...
- nginx 通过rsyslog发日志 rsyslog服务器挂掉 日志丢失问题
nginx 配置: user nginx; worker_processes 1; syslog local5 nginx-zjzc01; rsyslog 服务器收到的消息: -rw-r--r-- 1 ...
- 十几个remote control software
5 alternatives to LogMeIn Free for remote PC access VNC VNC, or Virtual Network Computing, isn’t its ...
- C++实现Http Post请求
参考资料: http://apps.hi.baidu.com/share/detail/39003388 http://blog.csdn.net/yc0188/article/details/474 ...