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发布
性能得到大幅改良的avalon1.3发布了. 修复$outer BUG 修复IE6-8下扫描加载Flash资源的OBJECT标签时,遇到它既没有innerHTML也没有getAttributeNode ...
- EL的基本使用
总结:EL操作的是作用域 <body> <% Users users = new Users("lisi","lisi123","l ...
- LDA处理文档主题分布代码
[python] LDA处理文档主题分布代码入门笔记 http://blog.csdn.net/eastmount/article/details/50824215
- C#泛型序列化困境
[C#泛型序列化困境] 问题的起因是这样,有一个需求,将JsonArray转化为List,JsonArray中的元素均是string,此string可被转化为int.float.或维持string.我 ...
- 03-使用html静态页面展示执行效果
使用工作流框架可以做什么事情?写代码呗,没那么简单.
- shader一般都是用工具调试的
N卡的话用nvidia的nVidia FX Composer, A卡的话用ATI的render monkey 顶点着色器从何方拿到这些数据?在U3D环境下,答案是从绑定到game object中的Me ...
- python在windows环境安装MySQLdb
一.环境 系统:win7,64位 python版本:2.7.15 pip版本:10.0.1 二.安装 1. 用pip安装 pip install MySQLdb 报错: Could not find ...
- linux下mysql开启远程访问权限及防火墙开放3306端口(mysql开放host访问权限)
开启mysql的远程访问权限默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限.主流的有两种方法,改表法和授权法.相对而言,改表法 ...
- Java程序设计11——异常处理
1 概述 异常机制已经成为判断一门编程语言是否成熟的标准,除了传统的像C语言没有提供异常机制之外,目前主流的编程语言如Java.Ruby.Python都提供了成熟的异常机制.异常机制可以使程序中异常处 ...
- 阿里云服务器ECS按ctrl+alt+delete无法登录
今天在使用阿里云服务器远程桌面的时候发现怎么也进入不了,远程桌面无法连接,于是想到了在阿里云服务器管理控制台可以使用连接管理终端进行远程桌面连接,下面详细介绍阿里云服务器操作经验. 操作步骤如下 登录 ...