C++基础系列二:预处理器
2013-06-24 19:43
169 查看
(1)常见预处理器指令集
C++继承了C的非常精细的预处理器,以高度受限的方式使用预处理器。预处理器主要的指令及功能如下表:
下面简要介绍预处理器使用的比较多的几个地方:
(2)头文件保护符:#ifndef ,#define ,#endif
头文件保护符:#ifndef ,#define ,#endif,是为了避免某个头文件被多重包含。如类Person中包含了头文件string,而使用Person类的程序中也许并不确定Person中是否已经包含string,于是它便再次#include<string>,这样一来,string就被包含了两次,为了保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义,就需要采用头文件保护符。
#define表示接受一个名字并定义该名字为预处理器变量;#ifndef指示检测指定的预处理器变量是否未定义,如果未定义,那么跟在其后的所有指示都被处理,直到出现#endif。
(3)#include <fileName.h>和#include "fileName.h"
对于#include <fileName.h>,编译器先从标准库路径开始搜索fileName.h,然后从本地目录搜索,用于系统文件调用较快;
而#include "fileName.h",编译器先从用户的当前工作路径中开始搜索fileName.h,然后寻找系统路径,用于自定义文件较快。
(4)使用预处理器进行调试
如果程序员希望程序所包含的调试代码仅在开发过程中执行,当应用程序已经完成并且准备提交时,就将调试代码关闭,那么可以通过使用NDEBUG预处理变量实现有条件的调试代码:
上面的代码中,如果NDEBUG未定义,那么第4行就会执行。开发完成后,可通过定义预处理变量NDEBUG来删除这些调试语句。大多数编译器都提供NDEBUG的命令行选型:
$ cc -DNDEBUG main.c
上述命令等效于在main.c的开头提供#define NDEBUG的预处理命令。
C++继承了C的非常精细的预处理器,以高度受限的方式使用预处理器。预处理器主要的指令及功能如下表:
指令 | 功能 |
# | 空指令,无任何效果 |
#include | 包含一个源代码文件,把源文件中的#include扩展为文件正文,即把包含.h的文件找到并扩展到#include所在处 |
#define | 定义宏 |
#undef | 取消已定义的宏 |
#if | 条件编译指令,如果为真,则编译下面的代码 |
#ifdef | 条件编译指令,如果宏已经定义,则编译下面的代码 |
#ifndef | 条件编译指令,如果宏没有定义,则编译下面的代码 |
#elif | 条件编译指令。如果之前的if不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个#if...#else条件编译块 |
#error | 停止编译并显示错误信息 |
(2)头文件保护符:#ifndef ,#define ,#endif
头文件保护符:#ifndef ,#define ,#endif,是为了避免某个头文件被多重包含。如类Person中包含了头文件string,而使用Person类的程序中也许并不确定Person中是否已经包含string,于是它便再次#include<string>,这样一来,string就被包含了两次,为了保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义,就需要采用头文件保护符。
#define表示接受一个名字并定义该名字为预处理器变量;#ifndef指示检测指定的预处理器变量是否未定义,如果未定义,那么跟在其后的所有指示都被处理,直到出现#endif。
(3)#include <fileName.h>和#include "fileName.h"
对于#include <fileName.h>,编译器先从标准库路径开始搜索fileName.h,然后从本地目录搜索,用于系统文件调用较快;
而#include "fileName.h",编译器先从用户的当前工作路径中开始搜索fileName.h,然后寻找系统路径,用于自定义文件较快。
(4)使用预处理器进行调试
如果程序员希望程序所包含的调试代码仅在开发过程中执行,当应用程序已经完成并且准备提交时,就将调试代码关闭,那么可以通过使用NDEBUG预处理变量实现有条件的调试代码:
void main() { #ifndef NDEBUG cerr<<"starting main..."<<endl; #endif }
上面的代码中,如果NDEBUG未定义,那么第4行就会执行。开发完成后,可通过定义预处理变量NDEBUG来删除这些调试语句。大多数编译器都提供NDEBUG的命令行选型:
$ cc -DNDEBUG main.c
上述命令等效于在main.c的开头提供#define NDEBUG的预处理命令。
相关文章推荐
- 【C++自我精讲】基础系列一 指针与引用
- C++基础语言(基础系列一)
- 26、不一样的C++系列--继承的基础知识
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- C++基础系列八:static类成员
- C++重点知识点(基础系列二)
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- Linux 软件系列之十五——C++基础
- 从Delphi转向VC系列学习一:C++基础知识
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- C++基础系列四:多维数组
- php程序员学C/C++之学习系列-【C基础】
- 【c++系列】类型转换以及预处理器定义的常量(当前的文件名、行号、时间、日期)
- c/c++基础(一) 字符串系列-外加mem处理
- 【C++自我精讲】基础系列三 重载
- C++基础系列:解引用与递增运算符*与++问题
- C++基础系列:输入输出流条件状态问题
- Xc-C++基础实例系列
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- C++基础系列六:sizeof 操作符