1. 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
  2. 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。
  3. C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#line
  1. #define 预处理指令用于创建符号常量。该符号常量通常称为宏,指令的一般
  2. 形式是:
  3. #define macro-name replacement-text
  4. 当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. #define PI 3.14159
  9.  
  10. int main ()
  11. {
  12.  
  13. cout << "Value of PI :" << PI << endl;
  14.  
  15. return ;
  16. }
  1. 预处理的结果。假设源代码文件已经存在,接下来使用 -E 选项进行编译,并把结果重定向到 test.p。现在,如果您查看 test.p 文件,将会看到它已经包含大量的信息,而且在文件底部的值被改为如下:
  2. $ gcc -E test.cpp > test.p
  3.  
  4. ...
  5. int main ()
  6. {
  7.  
  8. cout << "Value of PI :" << 3.14159 << endl;
  9.  
  10. return ;
  11. }
  1. 可以使用 #define 来定义一个带有参数的宏,如下所示:
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. #define MIN(a,b) (a<b ? a : b)
  6.  
  7. int main ()
  8. {
  9. int i, j;
  10. i = ;
  11. j = ;
  12. cout <<"较小的值为:" << MIN(i, j) << endl;
  13.  
  14. return ;
  15. }
  1. 有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。
  2. 条件预处理器的结构与 if 选择结构很像。请看下面这段预处理器的代码:
  3.  
  4. #ifdef NULL
  5. #define NULL 0
  6. #endif
  1. 可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:
  2. #ifdef DEBUG
  3. cerr <<"Variable x = " << x << endl;
  4. #endif
  5. 如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。可以使用 #if 0 语句注释掉程序的一部分,如下所示:
  6. #if 0
  7. 不进行编译的代码
  8. #endif
  1. #include <iostream>
  2. using namespace std;
  3. #define DEBUG
  4.  
  5. #define MIN(a,b) (((a)<(b)) ? a : b)
  6.  
  7. int main ()
  8. {
  9. int i, j;
  10. i = ;
  11. j = ;
  12. #ifdef DEBUG
  13. cerr <<"Trace: Inside main function" << endl;
  14. #endif
  15.  
  16. #if 0
  17. /* 这是注释部分 */
  18. cout << MKSTR(HELLO C++) << endl;
  19. #endif
  20.  
  21. cout <<"The minimum is " << MIN(i, j) << endl;
  22.  
  23. #ifdef DEBUG
  24. cerr <<"Trace: Coming out of main function" << endl;
  25. #endif
  26. return ;
  27. }
  1. # 和 ## 预处理运算符在 C++ 和 ANSI/ISO C 中都是可用的。# 运算符会把 replacement-text 令牌转换为用引号引起来的字符串。
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. #define MKSTR( x ) #x
  6.  
  7. int main ()
  8. {
  9. cout << MKSTR(HELLO C++) << endl;
  10.  
  11. return ;
  12. }
  1. ## 运算符用于连接两个令牌。下面是一个实例:
  2. #define CONCAT( x, y ) x ## y
  3. CONCAT 出现在程序中时,它的参数会被连接起来,并用来取代宏。例如,程序中 CONCAT(HELLO, C++) 会被替换为 "HELLO C++",如下面实例所示。
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. #define concat(a, b) a ## b
  8. int main()
  9. {
  10. int xy = ;
  11.  
  12. cout << concat(x, y);
  13. return ;
  14. }
  1. C++ 提供了下表所示的一些预定义宏:
  2. __LINE__ 这会在程序编译时包含当前行号。
  3. __FILE__ 这会在程序编译时包含当前文件名。
  4. __DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
  5. __TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main ()
  5. {
  6. cout << "Value of __LINE__ : " << __LINE__ << endl;
  7. cout << "Value of __FILE__ : " << __FILE__ << endl;
  8. cout << "Value of __DATE__ : " << __DATE__ << endl;
  9. cout << "Value of __TIME__ : " << __TIME__ << endl;
  10.  
  11. return ;
  12. }
  13. 当上面的代码被编译和执行时,它会产生下列结果:
  14. Value of __LINE__ :
  15. Value of __FILE__ : test.cpp
  16. Value of __DATE__ : Feb
  17. Value of __TIME__ : ::

吴裕雄--天生自然C++语言学习笔记:C++ 预处理器的更多相关文章

  1. 吴裕雄--天生自然C++语言学习笔记:C++ 基本语法

    C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例. 类 - 类可 ...

  2. 吴裕雄--天生自然C++语言学习笔记:C++ 标准库

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  3. 吴裕雄--天生自然C++语言学习笔记:C++ 动态内存

    栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运 ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 类 & 对象

    C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计.类是 C++ 的核心特性,通常被称为用户定义的类型. 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法.类中的 ...

  5. 吴裕雄--天生自然C++语言学习笔记:C++ 日期 & 时间

    C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四 ...

  6. 吴裕雄--天生自然C++语言学习笔记:C++ 字符串

    C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++简介

    C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ 可运行于多种平台上,如 ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 实例

    C++ 实例 - 输出 "Hello, World!" #include <iostream> using namespace std; int main() { co ...

  9. 吴裕雄--天生自然C++语言学习笔记:C++ STL 教程

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ Web 编程

    什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接 ...

随机推荐

  1. JAVA高级编程(数据源datasource)

    数据源:通过jdbc连接数据库,多建立几条连接放在数据源里面.可以设置数据源的最大连接数,同时活跃的连接数,最少空闲的连接数,能够同时接收处理的连接数等等. dbcp数据源 需要的jar包: comm ...

  2. Vue下URL地址栏参数改变却不能刷新界面

    在完成毕业设计(基于Vue的信息资讯展示与管理平台)的过程中,处理如下图所示的 点击左侧栏目列表跳转到对应文章列表 的问题时,初次点击可以跳转到对应的页面,但是当第二次点击时,虽然地址栏的参数改变了, ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:表单控件大小

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. shell脚本中执行sql脚本并传递参数(mysql为例)

    1.mysql脚本文件 t.sql insert into test.t values(@name,@age); exit 2.shell脚本文件 a.sh  (为方便演示,与t.sql文件放在同一目 ...

  5. 一、java基础-数据类型_数据类型转化_字符编码_转义字符

    1.Java  支持的8种基本数据类型: java的四种整数数据类型:byte 1    short 2     int4     long8   byte     8位带符号整数 -128到127之 ...

  6. eclipse搜索类快捷键

    习惯的编辑器可以提高编程效率,熟悉的快捷键可以提高工作效率,本文更新eclipse中常用的搜索快捷键 打开资源快捷键:Ctrl+Shift+R 通过在搜索框中输入名字可以很方便的在项目或工作空间中找某 ...

  7. eclipse不能启动,An internal error occurred during: "reload maven project".

    An internal error occurred during: "reload maven project". 这个错误是因为项目已经关闭,导致 导致此问题的原因是Sprin ...

  8. jquery使用css函数设置背景色无效解决办法

    外部的css样式为: #imageArea{ width: 200px; height: 300px; background-color: #eee !important; } 通过 以下代码来修改其 ...

  9. jquery 操作单选框,复选框,下拉列表实现代码

    1.复选框全选操作:其实说到底就是对Jquery 选择器的运用,点我查看Jquery选择器 html代码: 复制代码代码如下: <form> 您爱好的运动是: <input type ...

  10. lambda表达式和for_each,find_if

    1 lambda表达式可以允许我传递任意可调用对象,必须要有捕获列表和函数体,标准形式是[捕获列表] (参数列表)->return tpye{函数体} 谓词:一元谓词指的是只能接受一个传入参数, ...