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 ...
随机推荐
- Oracle EBS 查询用户职责
select b.user_name UserID, b.description User_Name, f.RESPONSIBILITY_NAME RESPONSIBILITY from FND_US ...
- [翻译] MotionBlur
MotionBlur https://github.com/fastred/MotionBlur MotionBlur allows you to add motion blur effect to ...
- qt的共享内存
https://blog.csdn.net/gdutlyp/article/details/50468677
- Linux系统优化实现高并发
ulimit -SHn 65535内核优化net.ipv4.ip_forward = 1 #开启路由功能net.ipv4.conf.default.rp_filter = 1 ...
- Office 365实现单点登录系列(4)—安装AD FS
单一登录 (Single Sign-On)简而言之,就是让用户使用一套ID和密码,就可以登录一个或多个系统的授权机制.用户只需要通过其中一个应用的安全认证之后,再访问同一服务器其他应用的资源时不需要再 ...
- scala数据库工具类
scala的数据库连接池,基于mysql import java.util.concurrent.ConcurrentHashMap import com.jolbox.bonecp.{ BoneCP ...
- ABAP很厉害是怎么一种体验?
知乎上偶然看到这个问题,觉得很有意思,我也来回答一发. 我本科和研究生学的是计算机专业,做项目用C/C++,研究生三年项目的代码量大概在三到四万行左右.2007年大学毕业加入SAP成都研究院一直工作到 ...
- ajax 跨域解决方法
最近在开发过程中,使用ajax去异步调取图片.在开发中这个功能没什么问题,可以后来提测,重新部署之后就有问题了,这就是ajax的跨域问题. ajax核心对象XMLHttpRequest本身是不支持跨域 ...
- [Java多线程] LinkedBlockingQueue
java.util.concurrent包下的新类.LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现. LinkedBlockingQueue Link ...
- Golang 临时对象池 sync.Pool
Go 1.3 的sync包中加入一个新特性:Pool.官方文档可以看这里http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低 ...