社区
C语言
帖子详情
内联函数与普通函数有什么区别,另外if和#if有什么区别
xunge
2001-07-19 09:14:43
...全文
321
14
打赏
收藏
内联函数与普通函数有什么区别,另外if和#if有什么区别
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xunge
2001-07-20
打赏
举报
回复
多谢各位大侠了!!!给分喽了(僧多粥少啊)!
zhy_study
2001-07-19
打赏
举报
回复
那我告诉你吧
内联函数,它被编译器处理为程序的一部分,不准确地说,就是在主程序代码的基础上又加入内联函数的代码。你可以近似的理解成#include的方式
普通函数,是处理成调用,即他的代码并不一定在主程序里头,而是通过一定的机制来获得他的服务
z_sky
2001-07-19
打赏
举报
回复
inline 函数在被调用的地方,实际上是把函数提的代码部分重复了一遍,而不是象普通函数那样将参数压栈,然后call ....,这样做可以减少函数的调用时间,提高程序执行的效率,但是如果有很多地方调用,程序将会很大,因为函数体被重复了许多遍。
Chice_wxg
2001-07-19
打赏
举报
回复
#if是给编译器看的,不会成为最终程序的一部分。
if是C关键字,负责条件处理
内联函数相当于先把这个函数编译,然后插入到调用的地方
普通函数则是编译后,并不插入到调用地方,而是在调用的地方call这个函数
(学点汇编基础就知道了)
xunge
2001-07-19
打赏
举报
回复
对不起我还是不太明白:内联函数与普通函数的具体区别在哪里呀?
z_sky
2001-07-19
打赏
举报
回复
内联函数(inline)在编译产生的代码,实际上不是调用,而是重复了代码本身。
#if 是预处理指令,是告诉编译器选择编译哪部分代码的指示,不是具体的代码。
minkerui
2001-07-19
打赏
举报
回复
内联函数可以提高效率!#if用与编译预处理
hyhong_h
2001-07-19
打赏
举报
回复
#if和if是截然不同的东西,怎么能代替呢?
举例说吧:
scanf("%c",&ch);
if(ch == 'Y')
{
printf("%c\n",ch);
}
这里,ch的值是在程序运行是用户从键盘上输入的,在程序编译的时候,编译器根本就不知道
ch的值是什么,你怎么用#if代替?
你可以把用这些语句试一下就明白了。
t1p2
2001-07-19
打赏
举报
回复
没有说出#if和if的根本区别,我发现在用if的地方好象可以用#if代替。不知道为什么。
floodzhu
2001-07-19
打赏
举报
回复
#if是编译指令,决定代码时候被编译到可执行文件中(如.exe中)
if是程序指令,肯定会编进可执行文件中(如果不在#if块中的话)
inline函数类的每个对象一一对应(要编译选项支持)
普通函数(非内联,非虚拟)和类一一对应,被同一个类的所有对象共同拥有
zb_china
2001-07-19
打赏
举报
回复
#if不是用来产生分支结构的,而是用来根据不同情况编译不同代码段的,如果条件不成立,其后的代码会被删除,不产生任何指令。
比如一种常见的应用是调试代码:将所有调试代码用预处理指令包围,判断条件是一个预定义是否存在,如果存在则生成调试代码,否则不生成调试代码。
z_sky
2001-07-19
打赏
举报
回复
to xunge: #if的实现的是选择编译,只用符合条件的才能进入目标代码,判断条件也是在编译时明确的; if实现的是分支代码,两路分支的代码都是目标代码的一部分,判断条件也是run-time可变的。明白“为什么不可完全用#if来代替if”了吧? :-)
用不着的话,你也不必专门去学编译原理,感兴趣最简单的办法就是:在vc里debug的时候,按 Alt_8 看 disasemmble 窗口。看看你写的代码都变成了什么样的汇编指令。
zb_china
2001-07-19
打赏
举报
回复
if是C关键字
#if是预处理指令,由预处理器处理,预处理器处理完后的东西才由编译器编译.
关于堆栈,是计算机原理的内容,跟数据结构没有关系,看微机原理.
xunge
2001-07-19
打赏
举报
回复
to z_sky():
正如您所说,#if可以选择编译,可以节省编译时间,那为什么不可完全用#if来代替if呢?另外是否有必要了解一下编译原理呀?(您上帖说了一些函数运行时参数压栈的问题,虽然我知道一点有关堆栈的知识,但还是有点迷糊,我也没看过数据结构,而是直接学的C++)
C&C++编程规范(超级实用)
1. 文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 目录结构 2. 程序版式 2.1 空行 2.2 代码行 2.3 代码行内的空格 2.4 对齐 2.5 长行拆分 2.6 修饰符的位置 2.7 注释 2.8 类的版式 3 命名规则 3.1 共性规则 3.2 Windows 应用程序命名规则 3.3 Linux 应用程序
函数
命名规则 4. 表达式和基本语句 4.1 运算符的优先级 4.2 复合表达式 4.3 if 语句 4.3.1 布尔变量与零值比较 4.3.2 整型变量与零值比较 4.3.3 浮点变量与零值比较 4.3.4 指针变量与零值比较 4.4 循环语句的效率 4.5 for 语句的循环控制变量 4.6 switch 语句 4.7 goto 语句 5. 常量 5.1 const 与#define 的比较 5.2 常量定义规则 6.
函数
设计 6.1 参数的规则 6.2 返回值的规则 6.3
函数
内部实现的规则 6.4 其它建议 6.5 使用断言 6.6 引用与指针的比较 软件测试系列 7 重载和内联 7.1
普通
函数
重载 7.2 内联
零起点学通C++多媒体范例教学代码
目录 第1篇初级篇 第1章 初识C++ 1.1 c++简介 1.2 C++与C的
区别
1.3 学习c++之前需要先学C吗 1.4 c++与其他语言的
区别
1.5 c++的版本以及安装问题 第2章 做一个最简短的C4-+程序 2.1 简单的屏幕输出小程序 2.2 输出语句的使用 2.3 std::介绍 2.4 iostream与iostream.h的
区别
2.5 重名问题 2.6 注释 2.7 总结 第3章 初步了解
函数
3.1 一个简单的
函数
3.2
函数
的传参 3.3
函数
的返回值、参数与变量 3.4.
函数
的声明与定义 3.5 局部变量 3.6 全局变量 3.7 总结 第4章 C4-+数据类型 4.1 变量的定义 4.2 将变量及数据存储在内存中 4.3 布尔型变量 4.4 字符型变量 4.5 wchart双字符型变量 4.6 整型概述 4.7 整型变量的定义 4.8 浮点型变量 4.9 常量 4.10枚举型常量 第5章 if语句与运算符 5.1 语句的定义 5.2 块的定义 5.3 表达式的定义 5.4 运算符的定义 5.4.1 赋值运算符的定义 5.4.2 数学运算符的定义 5.4.3 赋值运算符与数学运算符的联合 5.5 自加与自减 5.5.1 前置 5.5.2 后置 5.6 表达式的优先级 5.7 关系运算符 5.8 if语句 5.8.1 else语句 5.8.2 elseif语句 5.8.3 if语句的嵌套 5.9 逻辑运算符及其使用 5.9.1 逻辑“与” 5.9.2 逻辑“或” 5.9.3 逻辑“非” 5.9.4 逻辑运算符的优先级 5.9.5 运算式的真假关系 5.1 0三目运算符 5.1 0.1 三目运算符的优先问题 5.1 0.2 三目运算符的使用问题 5.1 0.3 三目运算符的型别问题 5.1 0.4 三目运算符在字符型变量中的应用 5.1 1复杂嵌套的if语句 5.1 2总结 第6章 面向对象 6.1 面向对象程序语言的主要特征 6.2 类、对象和成员 6.3 类、对象和成员的使用方法及
区别
6.3.1 声明一个类 6.3.2 命名习惯 6.3.3 定义一个对象 6.3.4 类与对象的
区别
6.3.5 对象与成员的关系 6.3.6 不要给类赋值 6.3.7 对象只能调用类中存在的方法 6.4 公有 6.5 私有 6.6 成员
函数
的声明和定义 6.7
内联
函数
6.7.1
普通
内联
函数
6.7.2 内联成员
函数
6.8 头文件与源文件 6.9 const成员
函数
6.10构造
函数
6.11默认构造
函数
6.12析构
函数
6.13析构对象数组 6.14总结 第7章 循环语句 7.1 循环语句的前身——goto语句 7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不休止的while循环 7.4. do……while循环 7.5 for循环 7.5.1 灵活的for循环 7.5.2 条件为空的for循环 7.5.3 执行为空的for循环 7.5.4 嵌套的for循环 7.6 switch语句 7.6.1 switch语句常见错误 7.6.2 switch的菜单功能 7.7 总结 第8章 指针 8.1 什么是地址 8.2 用指针来保存地址 8.2.1 空指针 8.2.2 指针与变量类型 8.2.3 用指针来访问值 8.2.4 指针地址、指针保存的地址和 该地址的值 8.2.5 指针对数值的操作 8.2.6 更换指针保存的地址 8.3 为什么使用指针 8.3.1 栈和堆 8.3.2 用指针创建堆中空间 8.3.3 用指针删除堆中空间 8.4 动态内存 8.4.1 内存泄漏 8.4.2 在堆中创建对象 8.4.3 在堆中删除对象 8.4.4 访问堆中的数据成员 8.4..5 在构造
函数
中开辟内存空间 8.4.6 对象在栈与堆中的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 8.7.2 指针的赋值运算 8.7 _3指针的相减运算 8.7.4 指针的比较运算 8.8 指针 8.8.1 常量指针 8.8.2 指向常量的指针 8.8.3 指向常量的常指针 8.9 总结 第9章 引用 9.1 什么是引用 9.1.1 引用的地址 9.1.2 引用就是别名常量 9.1.3 引用对象 9.1 4空引用 9.2
函数
的参数传递 9.2.1 按值传递 9.2.2 按址传递 9.2.3 按别名传递 9.2.4 让
函数
返回多个值 9.3 传递对象 9.3.1 按值来传递对象 9.3.2 利用指针来传递对象 9.3.3 利用cost指针来传递对象 9.3.4 利用引用来传递对象 9.3.5 到底是使用引用还是指针 9.3.6 引用和指针可以一块用 9.4 引用应注意的问题 9.4.1 引用容易犯的错误 9.4.2 引用一个按值返回的堆中对象 9.4 -3引用一个按别名返回的堆中对象 9.4.4 在哪里创建,就在哪里释放 9.5 总结 第10章 深入
函数
10.1
函数
重载 10.1.1
普通
函数
的重载 10.1.2 成员
函数
的重载 10.2
函数
的默认参数 10.3 重载构造
函数
10.3.1 成员变量的赋值与初始化 10.3.2 成员变量的初始化与构造
函数
10.3.3 复制构造
函数
10.3.4 构造
函数
和new运算符 10.3.5 再谈默认构造
函数
10.4.析构
函数
和delete运算符 10.4..1 默认析构
函数
10.4.2 调用构造
函数
进行类型转换 10.5 浅层复制构造
函数
10.6 深层复制构造
函数
第11章 运算符重载 11.1 运算符重载 11.2 在成员
函数
中实现自加 11.3 重载前置自加运算符 11.4 创建临时对象 11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载后置自加运算符 11.8 重载加法运算符
函数
operator+ 11.9 重载赋值运算符
函数
operator 11.10转换类型运算符 11.10.1 温习调用构造
函数
实现的类型转换 11.10.2 通过构造
函数
将变量转换为一个对象的成员变量 11.10.3 通过operator关键字进行转换 11.11什么可以重载,什么不可以重载 第12章 继承 12.1 什么是继承和派生 12.1.1 复杂的继承和派生 12.1.2 继承和派生如何在C++中实现 12.1.3 继承的种类及语法 12.1.4 单一继承 12.2 公有型、保护型和私有型 12.3 访问权限 12.4 多重继承 12.5 继承的构造与析构 12.6 合理利用基类构造
函数
12.7 继承和重载的两义性问题 12.7.1 多重继承容易产生两义性 12.7.2 继承中的重载 12.7.3 两义性的归属问题 12.7.4 减少两义性产生的混淆问题 12.7.5 虚基类不会产生两义性 12.8 总结 第13章 虚
函数
13.1 指向子对象的父指针 13.2 虚
函数
13.3 拳击游戏 13.4 继承是否可以实现多态性 13.5 在编译时的静态联编 13.6 在运行时的静态联编 13.7 在运行时的动态联编 13.8 在编译时的动态联编 13.9 调用虚
函数
13.9.1 在虚
函数
中调用成员
函数
13.9.2 3种调用虚
函数
的方式比较 13.10被继承的虚
函数
仍然是虚
函数
13.11系统是如何调用虚
函数
的 13.12在虚
函数
中使用成员名限定 13.13虚析构
函数
13.14总结 第14章 数组 14.1 数组的基本用法 14.1.1 什么是数组 14.1.2数组元素 14.1.3数组下标越界 14.1.4 倒序输出 14.1.5 将数组的下标定义为常量 14.1.6 手动操作数组元素 14.1.7 数组的初始化 14.2 数组的用途 14.2.1 求平均考试成绩 14.2.2 兔子繁殖问题 14.2.3 数字排序问题 14.3 数组在内存中的分布 14.4.输出数组名 14.5 数组名与
函数
14.6 传递与接收 14.7 数组与
函数
14.7.1
函数
传参实例一——求数组所有元素的和 14.7.2
函数
传参实例二——用递增法查找数据 14.7.3
函数
传参实例三——用二分算法查找数据 14.7.4
函数
传参实例四——判断数组是否按照顺序排列 14.7.5
函数
传参实例五——判断数组排列方式后执行不同的
函数
14.8 数组在对象中的传参 14.9 对象数组 14.10 在对象数组中初始化成员变量 14.11 指针数组 14.12 枚举常量与数组 14.13 多维数组 14.14 多维数组的初始化 14.15 字符数组 14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的图书链表 15.2.1 图书链表 15.2.2 类的链表 15.3 动态链表 15.3.1 动态链表的建立 15.3.2 解决输入字符造成死循环的问题 15.3.3 动态链表的显示 15.3.4 动态链表的删除 第16章 多态性 第17章 类的特殊成员 第2篇 高级篇 第19章 代码重用 第20篇 高级篇 第20章 友元类与嵌套类 第21章 流 第22章 命名空间 第23章 模板 第24章 异常和错误处理 第25章 补充知识 附录A ASCII码对照表 附录B C++的关键字 附录C C++常用头文件列表 附录D 运算符的优先级 后记
零起点学通C++学习_多媒体范例教学代码
目录 第1篇初级篇 第1章 初识C++ 1.1 c++简介 1.2 C++与C的
区别
1.3 学习c++之前需要先学C吗 1.4 c++与其他语言的
区别
1.5 c++的版本以及安装问题 第2章 做一个最简短的C4-+程序 2.1 简单的屏幕输出小程序 2.2 输出语句的使用 2.3 std::介绍 2.4 iostream与iostream.h的
区别
2.5 重名问题 2.6 注释 2.7 总结 第3章 初步了解
函数
3.1 一个简单的
函数
3.2
函数
的传参 3.3
函数
的返回值、参数与变量 3.4.
函数
的声明与定义 3.5 局部变量 3.6 全局变量 3.7 总结 第4章 C4-+数据类型 4.1 变量的定义 4.2 将变量及数据存储在内存中 4.3 布尔型变量 4.4 字符型变量 4.5 wchart双字符型变量 4.6 整型概述 4.7 整型变量的定义 4.8 浮点型变量 4.9 常量 4.10枚举型常量 第5章 if语句与运算符 5.1 语句的定义 5.2 块的定义 5.3 表达式的定义 5.4 运算符的定义 5.4.1 赋值运算符的定义 5.4.2 数学运算符的定义 5.4.3 赋值运算符与数学运算符的联合 5.5 自加与自减 5.5.1 前置 5.5.2 后置 5.6 表达式的优先级 5.7 关系运算符 5.8 if语句 5.8.1 else语句 5.8.2 elseif语句 5.8.3 if语句的嵌套 5.9 逻辑运算符及其使用 5.9.1 逻辑“与” 5.9.2 逻辑“或” 5.9.3 逻辑“非” 5.9.4 逻辑运算符的优先级 5.9.5 运算式的真假关系 5.1 0三目运算符 5.1 0.1 三目运算符的优先问题 5.1 0.2 三目运算符的使用问题 5.1 0.3 三目运算符的型别问题 5.1 0.4 三目运算符在字符型变量中的应用 5.1 1复杂嵌套的if语句 5.1 2总结 第6章 面向对象 6.1 面向对象程序语言的主要特征 6.2 类、对象和成员 6.3 类、对象和成员的使用方法及
区别
6.3.1 声明一个类 6.3.2 命名习惯 6.3.3 定义一个对象 6.3.4 类与对象的
区别
6.3.5 对象与成员的关系 6.3.6 不要给类赋值 6.3.7 对象只能调用类中存在的方法 6.4 公有 6.5 私有 6.6 成员
函数
的声明和定义 6.7
内联
函数
6.7.1
普通
内联
函数
6.7.2 内联成员
函数
6.8 头文件与源文件 6.9 const成员
函数
6.10构造
函数
6.11默认构造
函数
6.12析构
函数
6.13析构对象数组 6.14总结 第7章 循环语句 7.1 循环语句的前身——goto语句 7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不休止的while循环 7.4. do……while循环 7.5 for循环 7.5.1 灵活的for循环 7.5.2 条件为空的for循环 7.5.3 执行为空的for循环 7.5.4 嵌套的for循环 7.6 switch语句 7.6.1 switch语句常见错误 7.6.2 switch的菜单功能 7.7 总结 第8章 指针 8.1 什么是地址 8.2 用指针来保存地址 8.2.1 空指针 8.2.2 指针与变量类型 8.2.3 用指针来访问值 8.2.4 指针地址、指针保存的地址和 该地址的值 8.2.5 指针对数值的操作 8.2.6 更换指针保存的地址 8.3 为什么使用指针 8.3.1 栈和堆 8.3.2 用指针创建堆中空间 8.3.3 用指针删除堆中空间 8.4 动态内存 8.4.1 内存泄漏 8.4.2 在堆中创建对象 8.4.3 在堆中删除对象 8.4.4 访问堆中的数据成员 8.4..5 在构造
函数
中开辟内存空间 8.4.6 对象在栈与堆中的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 8.7.2 指针的赋值运算 8.7 _3指针的相减运算 8.7.4 指针的比较运算 8.8 指针 8.8.1 常量指针 8.8.2 指向常量的指针 8.8.3 指向常量的常指针 8.9 总结 第9章 引用
内联
函数
以及它和宏的
区别
内联
函数
以及它和宏的
区别
一、 概念 以 inline 修饰的
函数
叫做
内联
函数
。
内联
函数
在调用时不是像一般
函数
那样要转去执行被调用
函数
的
函数
体,执行完成后在转回调用
函数
中,执行其后的语句;而是在调用处用
内联
函数
体的代码来替换,这样没有
函数
压栈,将会节省调用的开销,提高运行效率。 //
内联
函数
inline int Max(int a, int b) { if (a < b)...
C++ |
内联
函数
内联
函数
在编译时进行展开,在调用点出产生一个
函数
体代码的拷贝。因此,对
内联
函数
进行任何修改后,都需要对所有调用该
函数
的模块进行重新编译,否则它将会继续使用旧的
函数
。 如果想把一个
函数
定义为
内联
函数
,则需要在
函数
名前面放置关键字 inline,在调用
函数
之前需要对
函数
进行定义。如果已定义的
函数
多于一行,编译器会忽略 inline 限定符。
内联
函数
的作用: 引入
内联
函数
的目的是为了解决程序中
函数
调用的效率问题,
函数
的调用会有
函数
栈帧的开辟和
函数
内资源的回收处理产生的开销。如果
函数
功能比较简单,如整数比较大小函
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章