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项来进行条件编译啦,方便快捷。

最新文章

  1. XPath使用示例
  2. 东大OJ-1051-旅行家的预算
  3. MVC-12 ActionMethodSelectorAttribute
  4. hdu 3951(博弈规律)
  5. SerialPort基本小例
  6. 下载的chm手册打不开的解决方法?
  7. EntityFramwork6 在项目中的应用实例
  8. VS2013关于“当前不会命中断点源代码与原始版本不同”的BUG
  9. 201521123065《java程序设计》第9周学习总结
  10. 链表回文判断(C++)
  11. host-only局域网络
  12. Android SDK Manager for Mac 在线更新镜像地址截至2017-10-01亲测有效
  13. U-Mail企业邮箱如何导入授权文件
  14. DGUT_FLY退役贴 &amp;&amp; FunCfans毕业总结-竞赛篇
  15. pta l2-28(秀恩爱分得快)
  16. 在SQL Server中创建用户角色及授权
  17. Struts2技术详解
  18. EM算法小结
  19. 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03
  20. electron 创建窗口2

热门文章

  1. [分 享] PHPCMS V9 更换域名,附件地址无法批更新(更换变便)问题&gt;解决方法!!
  2. struts2笔记02-action和Action类
  3. GetMemory()函数
  4. HTML 5 drag and drop 简介
  5. Golang网络库中socket阻塞调度源码剖析
  6. WIN7 64位通过VPN远程登录 ASP.Net通过VPN访问Oracle服务器
  7. 简单实现计算Edit Distance算法
  8. #include &lt;vector&gt;
  9. I Hate It(线段树)
  10. VB6关于判断模态窗体的问题