不同语言条件编译的使用

当你在写程度的时候,碰到一段代码,你希望它在本地测试的时是这样,而到了正式环境要那样的时候,比如说一个数据库的连接用IP址,一般来说都会有开发数据库和产品数据库之分,更多的情况还会有一个测试(给QA或客户测试用的)数据库:

1. string ip="localhost";  //本地开发时用的连接到 localhost

2. string ip="10.1.10.1";  //上正式环境用的连接到 10.1.10.1

对于这种情况,一般人都能想到的办法就是,如果在本地开发调试用,就用第一行,而把第二行注释掉;如果要拿去正式环境用,编译之前得到第一行注释掉,而用第二行。这样是否有点麻烦呢?每次都得想着做这个切换,如果是开发环境与正式环境网络说隔离还好说,如果是连通的,就有较大的可能性开发时误操作了正式环境的数据库,而且经常要打开这行,注释那行很罗嗦的。

这个时候就应该想到条件编译,条件编译(Conditional compilation)是采用编译前预处理的方式,编译器根据设定某个常量来决定编译哪些代码而舍弃哪些代码,不编译到中间或目标代码中。

例如对于上面的代码,可以在编译选项中或是在某个代码中设定一个条件或常量(宏定义),如 DEBUG,或在代码中写成 #define DEBUG ,然后代码中只需要写成

#ifdef DEBUG
   string ip = "localhost";   //如果定义了 DEBUG 就编译这行代码
#endif
#ifndef
   string ip = "10.1.10.1";   //如果没有定义 DEBUG 就编译这行代码
#endif

代码看起来似乎有些多,但是切换就比较方便了,开发时用DEBUG选项,发布时用RELEASE选项就行,如果有许多处类似这样的代码用条件编译就更方便了,注释反注释就显示得笨拙了。可能就有人想,如果我定义一个全局常量,开发时和发布时设定不同的值,然后再 if...else...来判断要执行哪些代码,这样不也可行吗,确定可以,但是 if...else...对应就是机器要指行的指令啊,采用条件编译就会不产生这种额外的开销。

条件编译跟语言应该是无关的,主要决定于编译器是否采用,因为它是一种预编译的行为,一般的 C/C++、VB、VB.NET、C#,甚至是J#、JScript/JavaScript都支持条件编译;像VC,VS.NET中都预设了 DEBUG 和 RELEASE 两种编译选,可是我可爱的 Java 却没有哪个编译器支持条件编译,每次还真只注释反注释的方法,或者 if...else...来判断执行,不失为一种缺憾。

下面我分别通过例了来介绍不同语言条件编译的用法。

今天太晚了,未完,待续....

本文链接 https://yanbin.blog/about-conditional-compile/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments