内联函数在代码中展开后不会产生二义性的根本原因是???????

忘世麒麟 2015-03-27 02:02:15
如题:
inline 比 宏安全,不会产生二义性。
但是根本原因是什么呢?有高手解释一下吗?谢谢!
...全文
323 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-04-24
  • 打赏
  • 举报
回复
引用 13 楼 baijiaheizhiganmao 的回复:
[quote=引用 12 楼 mewiteor 的回复:] 内联相当于先把函数编译成汇编语言或机器码,再替换原代码片段。 宏相当于先用宏中的C语言代码替换原来的C语言代码,然后再编译替换后的代码。 简单的说:内联就是先编译再替换,宏就是先替换再编译。 因为内联是先编译的,所以编译内联函数时是按照函数的语法对其进行编译的。
我去验证一下,貌似有道理!!!!!!!! 谢谢啊!互相学习![/quote] 为什么不直接参考gcc/g++源代码中处理宏和内联相关片断呢?
忘世麒麟 2015-04-24
  • 打赏
  • 举报
回复
引用 12 楼 mewiteor 的回复:
内联相当于先把函数编译成汇编语言或机器码,再替换原代码片段。 宏相当于先用宏中的C语言代码替换原来的C语言代码,然后再编译替换后的代码。 简单的说:内联就是先编译再替换,宏就是先替换再编译。 因为内联是先编译的,所以编译内联函数时是按照函数的语法对其进行编译的。
我去验证一下,貌似有道理!!!!!!!! 谢谢啊!互相学习!
忘世麒麟 2015-04-24
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
[quote=引用 13 楼 baijiaheizhiganmao 的回复:] [quote=引用 12 楼 mewiteor 的回复:] 内联相当于先把函数编译成汇编语言或机器码,再替换原代码片段。 宏相当于先用宏中的C语言代码替换原来的C语言代码,然后再编译替换后的代码。 简单的说:内联就是先编译再替换,宏就是先替换再编译。 因为内联是先编译的,所以编译内联函数时是按照函数的语法对其进行编译的。
我去验证一下,貌似有道理!!!!!!!! 谢谢啊!互相学习![/quote] 为什么不直接参考gcc/g++源代码中处理宏和内联相关片断呢?[/quote] 大概是因为我还没有这个概念吧.不过我会去看的.
赵4老师 2015-04-23
  • 打赏
  • 举报
回复
不存在没有二义性的宏!
#include <stdio.h>
#define add1(a,b) (a+b)
#define add2(a,b) ((a)+(b))
int i,j;
int main() {
    i=2;j=3;
    printf("%d\n",add1(i++,i*j));
    i=2;j=3;
    printf("%d\n",add2(i++,--i*j));
    return 0;
}
忘世麒麟 2015-04-23
  • 打赏
  • 举报
回复
引用 8 楼 taodm 的回复:
最根本原因就是,这是C++标准强制规定的。
这个有道理!但是同样是在代码处展开,是不是意味着:我写一个没有二义性的宏(比如(#define add(a,b) (a+b) ),这样一来和我写一个内联函数和一个宏就没有差别了呢?我还是希望知道,二义性的根本原因是什么(不是前面几楼说的不加括号导致的那个原因)
mewiteor 2015-04-23
  • 打赏
  • 举报
回复
内联相当于先把函数编译成汇编语言或机器码,再替换原代码片段。 宏相当于先用宏中的C语言代码替换原来的C语言代码,然后再编译替换后的代码。 简单的说:内联就是先编译再替换,宏就是先替换再编译。 因为内联是先编译的,所以编译内联函数时是按照函数的语法对其进行编译的。
忘世麒麟 2015-04-23
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
不存在没有二义性的宏!
#include <stdio.h>
#define add1(a,b) (a+b)
#define add2(a,b) ((a)+(b))
int i,j;
int main() {
    i=2;j=3;
    printf("%d\n",add1(i++,i*j));
    i=2;j=3;
    printf("%d\n",add2(i++,--i*j));
    return 0;
}
..........................................................
paschen 版主 2015-03-29
  • 打赏
  • 举报
回复
inline是一个进步,不像宏会遇到各种问题,是一种安全的方式 另外,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。
principl 2015-03-29
  • 打赏
  • 举报
回复
4楼,说的有道理。 #define sum(a, b) a+b int sum(a, b) 对比之下函数自然就安全的多了。
taodm 2015-03-29
  • 打赏
  • 举报
回复
最根本原因就是,这是C++标准强制规定的。
ri_aje 2015-03-29
  • 打赏
  • 举报
回复
标准特许的,生成的代码直接在当地,链接的时候根本看不见,也不可能重定义了。
bravery36 2015-03-27
  • 打赏
  • 举报
回复
二义性是指宏不加括号之类的东西时的意外,如 define mul(a, b) a * b mul(2 + 3, 2);// 2 + 3 * 2 = 8,不是 (2 + 3) * 2 = 10
此后三年 2015-03-27
  • 打赏
  • 举报
回复
宏是预编译干的事情, 没有类型检查。 内联函数是编译器干的事情, 虽然也类似宏一样的替换, 但是编译器会做类型检查。
赵4老师 2015-03-27
  • 打赏
  • 举报
回复
VC编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

64,642

社区成员

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

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