Android with root Git for version control Lircd with Raspberry Pi for IR receiver and sender Tips for Windows Depolying your own password management tool -- KeeWeb Depoly your flask app into Heroku Fix shit IE code manually ISBN to Book Category by Scraping DangDang A Generic Makefile for C/C++ Program Configure Raspberry pi Remove watermark with PyPDF2 tips for docker Anaconda+TensorFlow+CUDA Snippets Configure Remote Mathematica Kernel Build your own ngrok server Access Array SSL VPN 使用Rstudio制作html5幻灯片 tips for Mac OS X system Tips for ipython notebook 配置Ubuntu server + Openbox (Obuntu) tips for Vimperator tips for Vim 安装CUDA My First Jekyll Blog rsync常见选项 在Linux中读取Ipod touch的文件 tip for texmacs 在VPS上建站的一些tip Gnuplot绘图札记 Samba系统和autofs自动挂载 Linux中alsamixer声卡无法录音 搭建自己的RSS订阅器——Tiny Tiny RSS Grub2引导安装Ubuntu awk tips 将Ubuntu系统装入U盘 The Great Rtorrent 编译GCC 再这样剁手!!!该死的libgd 使用ulimit进行资源限制 使用SSH代理上IPV6 使用RCurl抓取网页数据 修复Ubuntu Grub记 openbox中的文件关联 在Ubuntu 12.04下编译qtiplot 处理BCM4312网卡驱动纪实 配置我的Ubuntu Server记 Cygwin杂记 Linux 使普通用户具有以超级权限执行脚本 让firefox自定义地处理文件类型 WordPress优秀主题及插件 在phpcloud上搭建wordpress UBUNTU下用pptpd做VPN server ubuntu升级内核过后的一些问题 安装telnet服务 kubuntu札记 64位kubuntu札记 统计软件R Virtualbox stardict星际译王 Ubuntu重装windows系统后的grub引导修复 SSH服务及花生壳域名解析 采用cbp2make工具由code::blocks工程创建makefile文件 UBUNTU 札记

跨平台编程中的宏定义

2013年07月20日

要用师兄的计算机算东西,无赖那上面是WINDOWS的系统,为了写出能够跨平台的代码,需要在代码中用到宏来选择编译。一种方法是自己在Makefile里面定义好该平台对应的宏。实际上,编译器基本上都会有一些已经定义好的宏来区别当前的平台,不需要自己重新定义。

开源项目Pre-defined Compiler Macros里列出了各种编译器区别不同平台、不同STL库、编译器版本等的宏。 一个更加简单的办法可以获知编译器中预定义好的宏,就是使用命令echo | g++ -dM -E -。此命令交给编译器一个空文件来做预处理,-dM使之输出定义的宏,-E使之在预处理后不再开始编译。通过比较不同平台下这两条命令的结果,挑选一些意义明显的宏就可以用来确定当前使用的平台了。

有人提到下面几个宏可以确定平台,但是有些我并没有看到,估计是因为我没有用其他编译器试过:

操作系统判定:
Windows:   WIN32
Linux:   linux
Solaris:   __sun
编译器判定:
VC:  _MSC_VER
GCC/G++:   __GNUC__
SunCC:   __SUNPRO_C和__SUNPRO_CC

下面介绍几个非常有用的宏:

__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。