吴裕雄--天生自然C++语言学习笔记:C++ 预处理器
- 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
- 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。
- C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#line 等
- #define 预处理指令用于创建符号常量。该符号常量通常称为宏,指令的一般
- 形式是:
- #define macro-name replacement-text
- 当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text。
- #include <iostream>
- using namespace std;
- #define PI 3.14159
- int main ()
- {
- cout << "Value of PI :" << PI << endl;
- return ;
- }
- 预处理的结果。假设源代码文件已经存在,接下来使用 -E 选项进行编译,并把结果重定向到 test.p。现在,如果您查看 test.p 文件,将会看到它已经包含大量的信息,而且在文件底部的值被改为如下:
- $ gcc -E test.cpp > test.p
- ...
- int main ()
- {
- cout << "Value of PI :" << 3.14159 << endl;
- return ;
- }
- 可以使用 #define 来定义一个带有参数的宏,如下所示:
- #include <iostream>
- using namespace std;
- #define MIN(a,b) (a<b ? a : b)
- int main ()
- {
- int i, j;
- i = ;
- j = ;
- cout <<"较小的值为:" << MIN(i, j) << endl;
- return ;
- }
- 有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。
- 条件预处理器的结构与 if 选择结构很像。请看下面这段预处理器的代码:
- #ifdef NULL
- #define NULL 0
- #endif
- 可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:
- #ifdef DEBUG
- cerr <<"Variable x = " << x << endl;
- #endif
- 如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。可以使用 #if 0 语句注释掉程序的一部分,如下所示:
- #if 0
- 不进行编译的代码
- #endif
- #include <iostream>
- using namespace std;
- #define DEBUG
- #define MIN(a,b) (((a)<(b)) ? a : b)
- int main ()
- {
- int i, j;
- i = ;
- j = ;
- #ifdef DEBUG
- cerr <<"Trace: Inside main function" << endl;
- #endif
- #if 0
- /* 这是注释部分 */
- cout << MKSTR(HELLO C++) << endl;
- #endif
- cout <<"The minimum is " << MIN(i, j) << endl;
- #ifdef DEBUG
- cerr <<"Trace: Coming out of main function" << endl;
- #endif
- return ;
- }
- # 和 ## 预处理运算符在 C++ 和 ANSI/ISO C 中都是可用的。# 运算符会把 replacement-text 令牌转换为用引号引起来的字符串。
- #include <iostream>
- using namespace std;
- #define MKSTR( x ) #x
- int main ()
- {
- cout << MKSTR(HELLO C++) << endl;
- return ;
- }
- ## 运算符用于连接两个令牌。下面是一个实例:
- #define CONCAT( x, y ) x ## y
- 当 CONCAT 出现在程序中时,它的参数会被连接起来,并用来取代宏。例如,程序中 CONCAT(HELLO, C++) 会被替换为 "HELLO C++",如下面实例所示。
- #include <iostream>
- using namespace std;
- #define concat(a, b) a ## b
- int main()
- {
- int xy = ;
- cout << concat(x, y);
- return ;
- }
- C++ 提供了下表所示的一些预定义宏:
- __LINE__ 这会在程序编译时包含当前行号。
- __FILE__ 这会在程序编译时包含当前文件名。
- __DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
- __TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。
- #include <iostream>
- using namespace std;
- int main ()
- {
- cout << "Value of __LINE__ : " << __LINE__ << endl;
- cout << "Value of __FILE__ : " << __FILE__ << endl;
- cout << "Value of __DATE__ : " << __DATE__ << endl;
- cout << "Value of __TIME__ : " << __TIME__ << endl;
- return ;
- }
- 当上面的代码被编译和执行时,它会产生下列结果:
- Value of __LINE__ :
- Value of __FILE__ : test.cpp
- Value of __DATE__ : Feb
- Value of __TIME__ : ::
吴裕雄--天生自然C++语言学习笔记:C++ 预处理器的更多相关文章
- 吴裕雄--天生自然C++语言学习笔记:C++ 基本语法
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例. 类 - 类可 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 标准库
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 动态内存
栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 类 & 对象
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计.类是 C++ 的核心特性,通常被称为用户定义的类型. 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法.类中的 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 日期 & 时间
C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 字符串
C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...
- 吴裕雄--天生自然C++语言学习笔记:C++简介
C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ 可运行于多种平台上,如 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 实例
C++ 实例 - 输出 "Hello, World!" #include <iostream> using namespace std; int main() { co ...
- 吴裕雄--天生自然C++语言学习笔记:C++ STL 教程
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ Web 编程
什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接 ...
随机推荐
- JAVA高级编程(数据源datasource)
数据源:通过jdbc连接数据库,多建立几条连接放在数据源里面.可以设置数据源的最大连接数,同时活跃的连接数,最少空闲的连接数,能够同时接收处理的连接数等等. dbcp数据源 需要的jar包: comm ...
- Vue下URL地址栏参数改变却不能刷新界面
在完成毕业设计(基于Vue的信息资讯展示与管理平台)的过程中,处理如下图所示的 点击左侧栏目列表跳转到对应文章列表 的问题时,初次点击可以跳转到对应的页面,但是当第二次点击时,虽然地址栏的参数改变了, ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:表单控件大小
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- shell脚本中执行sql脚本并传递参数(mysql为例)
1.mysql脚本文件 t.sql insert into test.t values(@name,@age); exit 2.shell脚本文件 a.sh (为方便演示,与t.sql文件放在同一目 ...
- 一、java基础-数据类型_数据类型转化_字符编码_转义字符
1.Java 支持的8种基本数据类型: java的四种整数数据类型:byte 1 short 2 int4 long8 byte 8位带符号整数 -128到127之 ...
- eclipse搜索类快捷键
习惯的编辑器可以提高编程效率,熟悉的快捷键可以提高工作效率,本文更新eclipse中常用的搜索快捷键 打开资源快捷键:Ctrl+Shift+R 通过在搜索框中输入名字可以很方便的在项目或工作空间中找某 ...
- eclipse不能启动,An internal error occurred during: "reload maven project".
An internal error occurred during: "reload maven project". 这个错误是因为项目已经关闭,导致 导致此问题的原因是Sprin ...
- jquery使用css函数设置背景色无效解决办法
外部的css样式为: #imageArea{ width: 200px; height: 300px; background-color: #eee !important; } 通过 以下代码来修改其 ...
- jquery 操作单选框,复选框,下拉列表实现代码
1.复选框全选操作:其实说到底就是对Jquery 选择器的运用,点我查看Jquery选择器 html代码: 复制代码代码如下: <form> 您爱好的运动是: <input type ...
- lambda表达式和for_each,find_if
1 lambda表达式可以允许我传递任意可调用对象,必须要有捕获列表和函数体,标准形式是[捕获列表] (参数列表)->return tpye{函数体} 谓词:一元谓词指的是只能接受一个传入参数, ...