出处:  http://blog.csdn.net/luotuo44/article/details/38300965



如果你打开Libevent的一些文件,比如util.h文件。就会发现使用了很多宏定义,并根据一些宏定义而进行条件编译。这些宏定义往往来自event-config.h文件中。

如util.h文件的代码开始处:

#ifdef _EVENT_HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef _EVENT_HAVE_STDINT_H
#include <stdint.h>
#elif defined(_EVENT_HAVE_INTTYPES_H)
#include <inttypes.h>
#endif

其会根据是否定义了某个宏,而决定是否包含某个头文件。从宏的名字来看,其指明了是否有这个头文件。有时还会指明是否有某个函数。这样做的原因很简单,因为Libevent是跨平台的,必须得考虑到某些系统可能没有一些头文件或者函数。

event-config.h文件是一个很基础和重要的文件。在文件的一开始有这样一句"This file was generated by autoconf when libevent was built"。这说明这个文件是在Libevent配置的时候生成的,即在编译Libevent之前就应该要生成该文件了。当然也早于我们在Libevent基础上编写应用程序。

其在编译之前就检查所在的系统的一些情况。比如是否含有某个文件或者函数。其对这些进行检测,然后把结果写入到event-config.h文件中。等到编译Libevent和编译我们的APP时,会include该头文件。

PS:上面两段的说法有点错误。待修改。

该文件大部分内容是根据config.h.in文件生成的。比如,config.h.in文件里面有下面的代码:

/* Define to 1if you have the <arpa/inet.h> header file. */
#undefHAVE_ARPA_INET_H
.....
/* Define ifyour system supports the epoll system calls */
#undefHAVE_EPOLL

对应地,Linux内核版本在2.6以上的Linux对应生成的event-config.h文件会定义这两个宏,如下:

/* Define to 1if you have the <arpa/inet.h> header file. */
#define_EVENT_HAVE_ARPA_INET_H 1
......
/* Define to 1if you have the <sys/epoll.h> header file. */
#define_EVENT_HAVE_SYS_EPOLL_H 1

而在Windows系统下生成的event-config.h文件就没有定义这两个宏。

可以说,event-config.h这个文件定义的宏指明了所在的系统有哪些可用的头文件、函数和一些配置。

又比如对于gcc来说,是支持__func__这个宏的,但对于VS编译器就不支持,VS对应功能的宏为__FUNCTION__。此时在Windows系统的event-config.h文件中,就会定义:

/* Define toappropriate substitue if compiler doesnt have __func__ */
#define_EVENT___func__ __FUNCTION__

而在util-internal.h文件中,有这样的定义:

#ifdef_EVENT___func__
#define __func___EVENT___func__
#endif

这样就可以在其他文件中通用__func__宏了,无需关注是什么系统了。

event-config.h文件的有些内容是根据编译Libevent时的配置选项生成的。比如是否支持多线程这个选项。如果配置Libevent的时,加入了这样一句

./configure--disable-thread-support

那么,在event-config.h文件将定义DISABLE_THREAD_SUPPORT这个宏,此时得到的Libevent是不支持多线程的。

event-config.h指明所在系统的环境相关推荐

  1. linux交叉编译tile环境搭建,g ++ - 在Ubuntu中在32位上交叉编译64位程序时,缺少包含“bits / c ++ config.h”...

    在我的64位系统上,我注意到存在以下目录: /usr/include/c++/4.4/x86_64-linux-gnu/32/bits 那么我的32位系统已经设置为64位交叉编译就应该有一个相应的目录 ...

  2. 十四、系统与环境函数

    十四.系统与环境函数 1.Clipboard() 功  能:提取或替换Windows系统剪贴板的文本内容. 语  法:Clipboard ( { string } ) 参  数:string:stri ...

  3. 系统移植(系统移植环境搭建及简单概念)

    linux系统 = linux内核 + 根文件系统; 根文件系统 = 库(/lib和/usr/lib) + 命令( /bin和/usr/bin) + 配置文件( /etc) + GUI(图形化界面,如 ...

  4. Android 系统编译环境设置及源代码编译

    一. 摘要    虽然已经在Android系统工作了一段时间, 但是每次需要重新setup环境的时候,都需要花一点时间, 所以就想借着这次在ubuntu 12.04 64bits系统上重新安装的机会, ...

  5. 最新EOS合约教程,从系统到环境,从创建到部署,从前端到后台,Dapp开发

    最新EOS合约教程,从系统到环境,从创建到部署,从前端到后台,Dapp开发 前言 环境 重点声明: 1,安装虚拟机也好, 双系统也好, 把Linux装了 2, 安装EOSIO开发环境, 使用js4eo ...

  6. 【Android 逆向】Android 系统文件分析 ( Android 系统 root 环境准备 | 查看 Android 根目录信息 )

    文章目录 一.Android 系统 root 环境准备 二.查看 Android 根目录信息 一.Android 系统 root 环境准备 需要一部 root 过的手机 , 或者直接使用带有 root ...

  7. Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量

    文章目录 一.命令介绍 二.选项参数 三.命令示例 (一)显示系统的环境变量 (二)从当前环境中删除指定的变量 (三)定义指定的环境变量 (四)在一个修改后的环境下执行命令 一.命令介绍 env命令用 ...

  8. win7系统服务器环境配置,win7系统服务器环境配置

    win7系统服务器环境配置 内容精选 换一换 镜像是云耀云服务器运行环境的模板,模板中包含了特定的操作系统和运行环境,有时也额外包括了一些预装的应用软件.通过镜像可以部署特定的软件环境,也可以将云服务 ...

  9. easyPR源码解析之ann_train.h/config.h

    ann_train.h源码定义一个 AnnTrain类,该类继承自ITrain类(在train.h文件中): #include "easypr/train/train.h" #in ...

最新文章

  1. 大厂程序员跳槽去小公司当CTO,是一种怎样的体验?
  2. java book打印机_Java调用打印机进行打印
  3. c语言中如何将select出来的字段值赋给一个变量,sql server 重命名列(字段)
  4. Java计算两点间经纬度距离(两种方式)
  5. java getscale_Java MajorType.getScale方法代碼示例
  6. unity实现图片轮播效果_Unity实现图片轮播组件
  7. vue/cli3 配置vux
  8. 2021抚顺高考成绩查询,2021年抚顺高考成绩排名及成绩公布时间什么时候出来
  9. 书籍推荐:零基础入门学习Python
  10. Let's Encrypt 申请通配符证书(使用DnsPod解析的域名操作)
  11. android 存储空间监控,浅谈 Android 内存监控(中)
  12. css对大小写不敏感
  13. 获得当月时间chuo_擅用GTD时间管理法,远离焦虑情绪,让你的工作、学习井然有序...
  14. 静态类型语言、动态类型语言、强类型定义语言、弱类型定义语言、编译型语言、解释型语言...
  15. 温莎计算机应用硕士是针对国际学生的吗,留学温莎大学
  16. 虚拟化是什么,虚拟化主要分为哪几种?
  17. linux刻录windows光盘启动,如何在 Windows / Ubuntu / macOS 上刻录 Ubuntu 启动光盘
  18. K8S:Volume
  19. jenkins创建流水线,基于gitlab与Jenkinsfile
  20. (转载)物联网平台 分类CMP、DMP、AEP、BAP

热门文章

  1. 计算机初级考试题库网络管理,计算机基础考试题库(含答案)
  2. 无监督学习 | DBSCAN 原理及Sklearn实现
  3. 本周开课 | 第 17 期高级转录组分析和R数据可视化火热报名中!!!
  4. 深度综述|基因与疾病关系研究的百年进展
  5. linux启动大叶机制,DPDK-Suricata应用部署
  6. vue框架可以配合php做企业站,基于Vue和PHP打造前后端分离的通用管理系统(一)...
  7. docker 安装mysql_docker|docker安装mysql数据库
  8. git fetch 与 git pull
  9. mui HTML5 plus 下载文件
  10. xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA收发器架构之硬件设计指导(一)