#if #define条件编译

本文探讨了C/C++中条件编译的作用,包括防止头文件重复包含、支持代码的平台移植性和实现不同版本间的代码选择。介绍了如何利用条件编译解决实际编程中遇到的问题。
我们在处理c/c++代码的时候,经常会用到#ifndef #define #endif,或者#if defined... #else #endif,我想这对于每一位c/c++程序员都不会陌生,但是不知道大家是否真正想过,或者总结过这些条件编译的用途否,反正我在大学期间,只知道这么用,后来也就一直这么用,没事也真的不太在意,直到上次有人问我他们的整个的用途的时候,还是只能说上一点,今天在网上查了下,然后结合平常一些工作用到的,大概说下。


   可能作为现在的软件系统而言,已经不大可能将所有的代码写到同一个文件当中去编译,就像类的定义,你不大可能将声明和定义放到一个头文件中,如果你非要这么做的话,很悲剧的时,你可能经常会遇到头文件的循环包含,而出现ld错误带来的满屏未定义变量,所以说她很好的提供程序逻辑块的跟别编译。


    还有一个就是条件编译。现在很多的开源library为了支持平台的可移植性,都使用条件编译将代码隔离开,因为不同的系统底层提供的一些api往往是不一样的,比如boost::asio中,在windows下,有现成的iocp可用,可以直接使用,但是很不幸的是,在linux下,好像还没有可实际使用的异步io,可能你会说不是有,aio_read,aio_write....据说,效率不怎么样,具体怎么样,我是没用过的,而是,在linux下就用poll,epoll,select,来实现,不同版本的linux,可能不一样,那怎样才能将他们用到一起呢,条件编译就很好的支持类这些,或者是你的代码中可能因为版本或者调试方面的问题,想要走不同的流程或者不同的输出结果,你也可以使用条件编译,


    头文件的重复包含从而导致变量,或者类的重复定义,这可能也是其中的一个问题,比如:

//A文件

class a

{

};


//B文件

#include "A.h"

class b : public a

{

};


//C文件

#include "A.h"


class c: public a

{

};

B和C文件都包含类A文件,想一下如果不用条件编译的话,那就回造成,多次包含A而造成A的重复定义,从而出现难以理解的编译错误,这就是俗称的头文件保护符,编译器变量有两种状态,一种是已定义,另一种就是未定义,当然你也可是用#if defined(...)来判断他是否一定义。

还有一个标较好地策略是,将const变量定义在头文件中,因为const变量默认为他的文件的局部变量,现在想到的也就这些,还有什么其他的用途,望大家指出,thank you!


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值