现在的位置: 首页 > 综合 > 正文

C/C++预处理

2012年09月18日 ⁄ 综合 ⁄ 共 1160字 ⁄ 字号 评论关闭

     今天来讨论下C/C++中的预处理。

预处理

(1)概念:预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理的编程语言一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译。

      处理预处理语句的程序称为预处理程序,也就是常说的预处理器,它包含在编译器中。预处理程序首先读源文件。预处理的输出是“翻译单元”,它是存放在内存听临时文件。编译器接受预处理的输出,并把源代码化成包含机器语言指令的目标文件。

      预处理器的作用是通过预处理的内建功能对一个资源进行等价替换。

(2)常见的预处理:文件包含、条件编译、布局控制和宏替换。

      <1>文件包含:

                         1.#include <文件名> 编译器从编译系统设定的包含文件的目录中查找文件,所以它常用于包含系统的头文件,如:iostream.h、math.h等。

                         2.#include "文件名" 编译器从当前工作目录中开始查找文件,若未找到再到包含文件的目录中去查找,所以它常用于查找用户自己编写的文件。

      <2>宏替换:#define,可以定义符号常量、函数功能、重新命名、字符串的拼接等各种功能。

      <3>条件编译:#if、#ifndef、#ifdef、#endif、#undef等是比较常见的预处理,主要是编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。

           比如,常用于区别debug和release编译的#ifdef _DEBUG:

int main(int argc, char* argv[])
{
#ifdef _DEBUG //如果是debug编译
...
打印详细日志的代码
...
#else //如果是release编译
...
打印普通日志代码
...
#endif
return 0;
}

      <4>布局控制:#progma,主要功能是为编译程序提供非常规的控制流信息。

            1.#progma comment(...):该指令将一个注释记录放入一个对象文件或可执行文件中。常用的lib关键字可以用于链接一个库文件,如#progma comment(lib,"user32.lib")指令用来将user32.lib库文件加入到工程中。

            2.#progma once:只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。

            3.#pragma pack:有关内存对齐知识,这里不作详细说明。

                           

抱歉!评论已关闭.