分享

编译预处理指令【精】

 lhzstudio 2012-05-12
译预处理指令:在正式编译之前,对源程序进行预先的处理。全部以符号“#”开始,每条指令占一行

include 文件包含指令

指示编译器将一个源文件嵌入到当前源文件中该指令处。

#include <> //声明公共的系统标准函数

#include “”   //声明用自定义的常量、变量和函数

头文件本质:

函数调用出现在函数定义之前,或者调用在其他文件中(如系统库)定义的函数,必须先进行函数声明。系统函数按其功能被分成几大类,对应每类函数有一个头文件,其中给出了这一类函数的原形声明。所以,只需在程序中使用#include指令包含相应的头文件,而不必在程序中直接进行函数的声明。

       以多文件方式组织的程序常常需要在各文件之间共享一些常量声明、变量声明、结构声明、函数声明和宏定义,可以将这些语句放在一个C++头文件中(以h作扩展名),然后利用#include指令将头文件包含到需要这些内容的源文件中。

个人理解:因为C++语言特点(见上)的缘故,所以需要头文件组织文件结构,而C#是完全面向对象的,基本类型都是对象,常量、结构、函数都是封装在类中的,就不需要头文件,类本身就是非常好的组织结构,只需添加相应类的引用即可。

头文件的其他作用:

一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

define 宏定义指令

宏是一个表示特定内容的标识符,被代表的内容称为宏体,编译程序以定义的宏体代替我、源文件中的宏,称为宏替换

宏、内联、const

带参数的宏与内联函数类似,但两者有本质区别。宏替换是在正式编译之前,不进行参数传递。函数调用发生在程序实际执行时,要进行实参与形参的传递。使用宏的好处是它不需要调用及返回时的开销。

宏也有不安全因素,对于不带参数的宏,使用const类型取代宏更安全。const会有类型检查,而define只是简单的替换。

条件编译指令

条件编译预处理是指按照指定的条件决定哪些源程序段将被编译,而哪些源程序段将不被编译,从而使编译程序能够对用户的源程序有选择性地满足一定条件的目标程序。

在进行条件编译时,常常将某个宏是否被定义作为条件编译的条件,定义这种宏时只需给出宏名,不需要指定宏体,如下所示: define <宏名>

如果要取消前面定义的宏,可使用 undef <宏名>

1.         if…[#else]…#endif

2.         ifdef…[#else]…#endif

3.         ifndef…[#else]…#endif

#if 检测后面的表达式的值的真假;#ifdef和#ifndef检测后面的宏是否被定义

程序员在调试程序时,经常需要使用输出语句显示一些调试信息(比如看一些过程的中间值,了解执行流程等),这时可以采用下面例题介绍的方法:在源程序开头位置定义一个调试宏,在所有调试信息输出语句前加上#ifdef条件编译指令,在程序调试完之后,为了不再显示这些信息,只需删除源程序开头位置的宏定义指令,重新编译链接程序即可,程序其他地方无需改动。++深刻理解这段话++

define DEBUG

main( )

{

       int nDebug = 5;

       int nRelease = 6;

#ifdef DEBUG

       cout << ”DEBUG : value is” << nDebug << endl;

#else

       cout << ”RELEASE : value is” << nRelease << endl;

#endif

       return ;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多