c++ 预处理和多重替换
预处理概念
#include
#define
extern 一、 预处理概念 在源代码编译成机器指令之前,都要进行预处理。
预处理阶段一般会在编译之前处理和修改C源代码。完成预处理后预处理指令就会在源代码中删除,然后才开始编译阶段。
注:预处理操作发生在编译之前。它们会修改程序语句,但不会被编译执行。
二、#include
#include<file.h> //表示在默认路径中搜索file.h 并用file.h里的内容替换 #include<file.h>
#include"file.h" //表示在当前目录里搜索file.h 并用file.h里的内容替换 #include"file.h"
三、#define
#define filenaeme "test.txt" //在预处理时 用"test.txt" 替换所有filename 并且删掉此行
#deinfe pi 3.1415926 //在预处时 用3.1415926 替换所有 pi 并且删掉此行
四、 extern
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(另外,在C++中extern也可用来进行链接指定。) 如在a.c中定义过全局变量 int a要在hello.c中引用全局变量a则要作如下定义:
extern int a;
仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 如在a.c中定义过全局函数 int add(int a,int b)要在hello.c中引用函数add则要作如下定义:
extern int add(int,int);
仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
教学内容:
宏替换
看起来像函数的宏
多行上的预处理指令
结合两个宏展开式的结果
容易范错的宏 一、 宏替换
支持参数替换的#define指令,我们一般称为宏指令。它也属于预处理指令。
例:
#define print_int(i) printf("%d\n",i) 二、 看起来像函数的宏
#define add(a,b) a+b
#define mul(a,b) a*b 三、 多行上的预处理指令
#define add(a,b) \
a+b
#define mul(a,b) \
a*b 四、 结合两个宏展开式的结果
int my1=;
int my2=;
#define cat(a,b) a##b printf("%d,%d",cat(my,),cat(my,)); 五、容易范错的宏
#define mul(a,b) a*b
mul(,-) //按照一般的理解应该是5*(3-2)=1 实际上替换展开后是 5*3-2=13
修改
#define mul(a,b) ((a)*(b))
c++ 预处理和多重替换的更多相关文章
- 【C语言探索之旅】 第二部分第五课:预处理
内容简介 1.课程大纲 2.第二部分第五课: 预处理 3.第二部分第六课预告: 创建你自己的变量类型 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语 ...
- c语言的预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含
宏简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 所有的预处 ...
- mysql :SQL语句中的替换函数replace
replace() 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法 REPLACE ( 'string_expression1' , 'string_expressio ...
- php替换空格(php函数的设计思路)
php替换空格(php函数的设计思路) 一.总结 1.替换和也是先查找了再替换,截取的话就是先查找到再截取 2.设计函数的时候按照的是缺省参数在后,核心东西在前的思路来设计函数的:查找的话是$sear ...
- ISO/IEC 9899:2011 条款6.10.3——宏替换
6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的 ...
- C预处理之宏定义
#include <stdio.h> //定义不带参数的宏 #define PI 3.14 /*********************************************** ...
- C++_基础5-内存模型
C++为在内存中存储数据提供了多种选择: 可以选择数据保留在内存中的时间长度(存储持续性): 程序的哪一部分可以访问数据(作用域和链接): 可以使用new来动态地分配内存:定位new运算符提供了这种技 ...
- C语言基础回顾
第一章 C语言基础 1. C语言编译过程 预处理:宏替换.条件编译.头文件包含.特殊符号 编译.优化:翻译并优化成等价的中间代码表示或汇编代码 汇编:生成目标文件,及与源程序等效的目标的机器语言代码 ...
- Linux内核循环链表经典分析和移植
为什么说这个链表做的经典呢,哥哥我从Linux内核里边儿扣出来的,要么怎么说内核不是一般人能写的,这代码太TM优美了! 这里有一篇参考文章:http://isis.poly.edu/kulesh/st ...
随机推荐
- 11.Spring——JDBC框架
1.DBC 框架概述 2.Spring JDBC 示例 3.Spring 中 SQL 的存储过程 1.DBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关 ...
- 4.使用bat调用可执行jar文件
一.项目需求 1.maven工程 2.有properties配置文件. 3.有内部jar包 二.简单的是实现实例 1.项目文件放置 注意:如果是web工程,我们会将jar文件当到我们项目WEB-INF ...
- c# 设计模式 之:策略模式
算法与对象的耦合: 对象可能经常需要使用多种不同的算法,但是如果变化频繁,会将类型变得脆弱... 动机: 在软件构建过程中,某些对象使用的算法可能多种多样,经常 ...
- commonjs详解
marked here a well written artical http://javascript.ruanyifeng.com/nodejs/module.html
- 几个很好用SQL语法(SqlServer)
1,MERGE INTO 语句: 这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE,作用还是很强大的(简单的说就是它可以批量更新和插入处理一个数据集,如果存在就更新 ...
- 封装用于解析NSDate的便利的类
封装用于解析NSDate的便利的类 此类可以从NSDate中解析出年份,月份,日期,时,分,秒,毫秒,足够用来做好多事情了,现提供源码如下: 以下是核心的类: TimeInfo.h 与 TimeInf ...
- django配置连接多个数据库,自定义表名称
在项目tt下新建两个app,分别为app01.app02.配置app01使用default节点数据库:app02使用hvdb节点数据库(也可以配置app01下的model既使用default,也可以使 ...
- MDT配置数据库
连接数据库可以使用数据库账户和Windows集成身份验证两种方法:使用数据库账户:1.连接数据库时选择TCP/IP2.在数据库中添加相应规则后,配置数据库3.在CustomSettings.ini文件 ...
- Linux 环境部署记录(三) - Jenkins安装与配置
Jenkins安装 为了兼容生产环境的jdk1.7版本,从官网得知,Jenkins必须是1.6之前的版本,因此下载jenkins-1.596.3-1.1.noarch.rpm到本地进行安装: #移动到 ...
- zabbix的日常监控-磁盘性能监控(十二)
监控磁盘的性能 参考文章: https://wiki.enchtex.info/howto/zabbix/zabbix_iostat_monitoring https://blog.csdn.net/ ...