#define 和 inline 有什么不同

kim_jinye 2009-08-06 06:49:39
#define ABC(x) (x*x)

inline int abc(const int x) {return (x*x);}

请问大家ABC和abc什么时候执行结果不同?
...全文
320 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengjieBKB 2011-09-23
  • 打赏
  • 举报
回复
今天笔试题是这个,一大片的空白~~
kim_jinye 2009-08-07
  • 打赏
  • 举报
回复
我问的是执行结果什么时候不同
woodstone121 2009-08-07
  • 打赏
  • 举报
回复
大家 说的很全了啊
mu_yang 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yshuise 的回复:]
引用 17 楼 mu_yang 的回复:
引用 16 楼 yshuise 的回复:
引用 15 楼 mu_yang 的回复:
补充
#define 是必然替换的
inline 可能替换也可能不替换,看编译器心情
所以inline对于初学者没什么意义

你书上的知识应该改改了。书上对于inline 的论述是落后了。


你的依据?

测试。
[/Quote]
测试条件?测试环境?
测试数据?
你是否把所有的编译器在所有的环境下都测试过?
即使你都测过
也没理由说“你书上的知识应该改改了。书上对于inline 的论述是落后了。”这句话吧
carylucky 2009-08-07
  • 打赏
  • 举报
回复
inline类似函数体替换,对类型进行检查,就是一个函数而已吧
mu_yang 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yshuise 的回复:]
引用 17 楼 mu_yang 的回复:
引用 16 楼 yshuise 的回复:
引用 15 楼 mu_yang 的回复:
补充
#define 是必然替换的
inline 可能替换也可能不替换,看编译器心情
所以inline对于初学者没什么意义

你书上的知识应该改改了。书上对于inline 的论述是落后了。


你的依据?

测试。
[/Quote]
荒谬!
yshuise 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mu_yang 的回复:]
引用 16 楼 yshuise 的回复:
引用 15 楼 mu_yang 的回复:
补充
#define 是必然替换的
inline 可能替换也可能不替换,看编译器心情
所以inline对于初学者没什么意义

你书上的知识应该改改了。书上对于inline 的论述是落后了。


你的依据?
[/Quote]
测试。
mu_yang 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 morilasi 的回复:]
inline好像确实是不一定替换。inline只是建议编译器替换
[/Quote]

看来会看书的还有
morilasi 2009-08-07
  • 打赏
  • 举报
回复
inline好像确实是不一定替换。inline只是建议编译器替换
mu_yang 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yshuise 的回复:]
引用 15 楼 mu_yang 的回复:
补充
#define 是必然替换的
inline 可能替换也可能不替换,看编译器心情
所以inline对于初学者没什么意义

你书上的知识应该改改了。书上对于inline 的论述是落后了。

[/Quote]
你的依据?
yshuise 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mu_yang 的回复:]
补充
#define 是必然替换的
inline 可能替换也可能不替换,看编译器心情
所以inline对于初学者没什么意义
[/Quote]
你书上的知识应该改改了。书上对于inline 的论述是落后了。
mu_yang 2009-08-07
  • 打赏
  • 举报
回复
补充
#define 是必然替换的
inline 可能替换也可能不替换,看编译器心情
所以inline对于初学者没什么意义
morilasi 2009-08-07
  • 打赏
  • 举报
回复
如果你的书上没讲这个问题,把这本书扔了重买本
yshuise 2009-08-07
  • 打赏
  • 举报
回复
并不运行这段代码
yshuise 2009-08-07
  • 打赏
  • 举报
回复
#define 等元编程 方式最大的缺点就是无法调试。
这样学习起来很复杂。比如元编程,因为模板支持一种方式:SFINAE
这更加大了学习的困难,跟踪了很久的代码源码,原来是错误的。模板并不掉这段代码。
yshuise 2009-08-07
  • 打赏
  • 举报
回复
#define 替换,在编译时期的替换。
优点就是可以在作为“代码生成器”来使用。比如MFC,以及Boost::Preprocessor,
生成c++/c的代码效率很高,免去了很多的重复代码。

inline 最大的优点就是对for循环之类的进行优化。

他们的差距其实很多。主要就是看使用的方式了。
ervinsas 2009-08-06
  • 打赏
  • 举报
回复
这两行功能上一样,但区别在于:

define只是做简单替换,根本没有任何语法错误等检查。

inline会有类型,语法等安全检查。
拉卡尼休 2009-08-06
  • 打赏
  • 举报
回复
大家都说区别了,没人回答什么时候调用结果不同,我给补充一下
类似于这样的调用ABC(1+1)跟abc(1+1);结果不一样
ABC(1+1)展开是1+1*1+1=3
abc(1+1)返回2*2=4
飞天御剑流 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 kim_jinye 的回复:]
#define ABC(x) (x*x)

inline int abc(const int x) {return (x*x);}

请问大家ABC和abc什么时候执行结果不同?
[/Quote]

区别主要是三点:

一、类函数宏的参数只是替换,内联函数的参数有完全求值过程;

二、类函数宏的参数没有类型提升或者转换,而内联函数的参数有类型提升或转换;

三、类函数宏没有类型检查,内联函数有。
yangyunzhao 2009-08-06
  • 打赏
  • 举报
回复
区别大了
加载更多回复(6)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧