C语言中宏定义与C++中的内联函数
一,宏定义:在预处理的时候把宏定义的内容替换到代码中,正常编译。
1,无参数宏定义和有参数宏定义
(1)宏定义不能加分号,比如:#define PI 3.24;错的,#define PI 3.24对的。
(2)带参数宏定义,注意参数用括号包起来,因为参数有可能表达式;宏名和形参之间不能有空格。
(3)带参数宏定义和带参数的函数,在使用时候有差别的。
带参数函数示例:
#include <stdio.h> int SQ(int); int main()
{
int i=;
while(i<=)
printf("%d\n",SQ(i++));
return ;
} int SQ(int y)
{
return((y)*(y));
}
带参数宏定义示例:
#define SQ(y) ((y)*(y)) #include <stdio.h> int main()
{
int i=;
while(i<=)
printf("%d\n",SQ(i++));
return ;
}
两个程序运行结果是不同的,分析知:使用函数时候,i值传给函数,return((i)*(i));;而宏定义直接替换,把i++传递给宏定义函数,SQ(i++) ((i++)*(i++))。因此结果不同。
(4)宏定义中"\","#","#@"和"##", 在用#define 定义时 , 斜杠("\")是用来续行的,"#"用来把参数转换成字符串,是给参数加上双引号。"##"则用来连接前后两个参数,把它们变成一个字符串,"#@"是给参数加上单引号。下面的例子会使您很容易理解。
#define Conn(x,y) x##y
#define ToChar(a) #@a
#define ToString(x) #x
二,内联函数:在编译阶段直接将内联函数内容插入目标代码,因此不用中断调用函数,加快程序执行速度,但是在每个调用函数地方用函数内容替换,加大空间的开销。
1,内联函数关键字是inline。inline是“定义的关键字”,而不是“声明的关键字”。
以下方式不对:
inline void Foo(int x, int y); // inline仅与函数声明放在一起
void Foo(int x, int y)
{
…
}
以下方式正确:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline与函数定义体放在一起
{
…
}
2,什么情况下用内联函数
(1)一个函数不断被重复调用。
(2)函数只有简单几行,且函数内不包含循环语句(for、while),开关语句(switch)。
3,在类中,类成员函数在类中声明定义时候,自动把成员函数设为内联函数(此函数无循环语句和开关语句);如果成员函数在类体内声明,类体外定义,则此成员函数不是内联函数。
三,宏定义和内联函数的差别
宏不是函数,只是在编译前(编译预处理阶段),将程序中有关字符串不加任何验证的简单替代为宏体。
内联函数是函数,在编译阶段,将有关代码嵌入到调用处,不需要中断调用函数,加快速度,但是增加了空间开销。
C语言中宏定义与C++中的内联函数的更多相关文章
- 带参宏定义和inline修饰的内联函数
带参宏定义和inline修饰的内联函数都是在编译时,用函数体替换掉宏调用或函数调用.这样用的好处是减少调用函数所花费的时间. 例如: 算法导论在讲到堆排序时说的,好的堆排序实现一般是把Left(i), ...
- 【C语言天天练(二一)】内联函数
引言:调用函数时,一般会由于建立调用.传递參数.跳转到函数代码并返回等花费掉一些时间,C语言的解决的方法是使用类函数宏.在C99中,还提出了第二种方法:内联函数. 内联 ...
- c++中函数的参数传递,内联函数和默认实参的理解
1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...
- 宏定义#define和内联函数inline的区别
1 宏定义在预编译的时候进行字符串替换.内联函数在编译的时候进行函数展开. 2 宏定义没有类型检查.内联函数会进行参数列表.返回值等类型检查.
- C++(十七) — 宏代码、内联函数
1.C++ 表达式返回值 返回引用:当函数返回引用类型时,没有复制返回值.相反,返回的是对象本身.(与之对应的C语言中,返回的是变量的值) C++中,表达式返回的是变量本身(也就是变量对应的地址). ...
- C++中的内联函数分析
1,本节课学习 C++ 中才引入的新的概念,内联函数: 2,常量与宏回顾: 1,C++ 中的 const 常量可以替代宏常数定义,如: 1,const int A = 3; <==> #d ...
- C++中的内联函数
(1)定义.函数声明和定义时,在返回值类型前加inline关键字. (2)作用.避免调用时的额外开销. (3)使用情况.函数体很小,且频繁调用. (4)本质.通过牺牲代码段空间,来提高程序运行的时间效 ...
- [ 随手记 1 ] C/C++宏,普通函数,内联函数
函数定义 C 语言中的函数定义的一般形式如下: return_type function_name( parameter list ) { body of the function } 在 C 语言中 ...
- 嵌入式C语言自我修养 10:内联函数探究
10.1 属性声明:noinline & always_inline 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色.我 ...
随机推荐
- 迷你MVVM框架 avalonjs 1.3.3发布
大家可以在仓库中看到,多出了一个叫avalon.observe的东西,它是基于Object.observe,dataset, Promise等新API实现.其中,它也使用全新的静态收集依赖的机制,这个 ...
- 与DispatcherServlet的 url-pattern配置问题
<!--当DispatcherServlet 的url-pattern配置成/ 访问不到静态资源 的解决方法1:使用Tomcat默认的Servlet解决 --> 在web.xml中加以下代 ...
- Linux系统下使用ckfinder上传中文名的图片无法正常预览
问题描述:使用ckfinder上传带有中文名称的图片后在Windows本地可以正常预览,部署在Linux系统后,带有中文名的图片不能正常显示 解决办法:找到Tomcat的根目录 --> conf ...
- iOS7的iBeacon初步使用
iBeacon是iOS7的新增的功能,通过BLE实现室内定位,精确到厘米级别. 测试使用两台iPhone(支持BLE),一台作为iBeacon基站广播信号,代码使用官方源码AirLocate,另外一台 ...
- 在Linux下删除文件及文件夹(rm)
删除目录.文件 rm(remove) 功能说明:删除文件或目录.语 法:rm [-dfirv][--help][--version][文件或目录...]补充说明:执行rm指令可删除文件或目录,如欲删除 ...
- select_shape_proto算子的几种特征模式含义解析
select_shape_proto是一个非常有用的region筛选算子,但是由于难以理解,因此一般人使用得不是太多. 算子签名如下: select_shape_proto(Regions, Patt ...
- 常见的C语言内存错误及对策(转)
http://see.xidian.edu.cn/cpp/html/483.html 一.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就 ...
- Java开发环境之------MyEclipse快捷键和排除错误第一选择ctrl+1(***重点***:ctrl+1,快速修复---有点像vs中的快速using
using Java开发环境之------MyEclipse快捷键和排除错误第一选择ctrl+1(***重点***:ctrl+1,快速修复---有点像vs中的快速using 2015-06-29 浏览 ...
- swift UITabelVIew - 纯代码自定义tabelViewCell
// // CustomTableViewCell.swift // tab // // Created by su on 15/12/7. // Copyright © 2015年 tian ...
- python使用smtplib和email发送腾讯企业邮箱邮件
公司每天要发送日报,最近没事搞了一下如何自动发邮件,用的是腾讯企业邮箱,跟大家分享一下我的研究过程吧. 以前弄的发邮件的是用qq邮箱发的,当时在网上查资料最后达到了能发图片,网页,自定义收件人展示,主 ...