当前位置: 首页 > news >正文

建设企业网站电话是多少集团网站推广

建设企业网站电话是多少,集团网站推广,公司注册代办无地址注册,批发网站有哪些平台C推出了inline关键字,其目的是为了替代C语言中的宏函数。 我们先来回顾宏函数: 宏函数 现有个需求:要求你写一个Add(x,y)的宏函数。 正确的写法有一种,错误的写法倒是五花八门,我们先来“见不贤而自省也。” // …

C++推出了inline关键字,其目的是为了替代C语言中的宏函数。

我们先来回顾宏函数:

宏函数 

现有个需求:要求你写一个Add(x,y)的宏函数。

正确的写法有一种,错误的写法倒是五花八门,我们先来“见不贤而自省也。”

// 实现⼀个ADD宏函数的常⻅问题
#define ADD(int a, int b) return a + b;
#define ADD(a, b) a + b;
#define ADD(a, b) (a + b)

分析:

第一种写法:宏函数不是函数,它是宏,在预处理阶段就替换成了目标内容。

第二种写法:还是错的,少括号,较第一种好一点—— 在于没加分号

第三种写法:还是不对,不过好多了,错在少括号。

正确写法:

// 正确的宏实现
#define ADD(a, b) ((a) + (b))

这个写对了,不过“知其然,亦要知其所以然”。

// 为什么不能加分号 ?
// 为什么要加外⾯的括号 ?
// 为什么要加⾥⾯的括号 ?
//为什么不能添加分号 ;
#define Add(a,b) ((a) + (b));
int main()
{int ret1 = Add(1,2);//意在实现1 + 2并将结果赋值给ret1cout << ret1 << endl;//意在打印ret1return 0;
}

运行截图:

 

好戏还在后头:

cout << Add(1,3) << endl;

我们在前面曾说到:cout 能够自动识别变量类型,这里报错是因为函数的结果是它识别不了了嘛。 非也非也:

宏在预处理阶段,会将Add(1,3)替换成后面的表达式:这里若多加了分号,这行代码就在分号处中断了,而作为二元操作符的 << 前面无操作对象 后面又有个endl;自然因为缺少参数(表达式)报错。

cout << ((1) + (3)); << endl;//预处理阶段被替换成了如此模样

所以,宏函数里分号是多余的:

#define Add(a,b)  ((a) + (b))
int main()
{cout << Add(1,3) << endl;//这才能输出4return 0;
}

运行截图:

// 为什么要加外⾯的括号?
#define Add(a,b)  (a) + (b)
int main()
{cout << Add(1, 3) * 2 << endl;//意图输出 8 (4*2)return 0;
}
//替换后
//cout << Add(1, 3) * 2 << endl;
cout << (1) + (3) * 2 << endl;//然而据分析,输出7 (1+6)

 运行截图:

可见,外面括号是为了不改变运算表达式的结合的优先级,我们写个宏函数Add本意就是为了先算加法。

// 为什么要加⾥⾯的括号?
#define Add(a,b)  (a + b)
int main()
{int x = 1, y = 2;Add(x & y, x | y);//不加内括号,替换成 (x&y + x|y)return 0;
}
//但是忽略了加法作为算数运算符的优先级,其实结果会先算 y+x,故而与目标结果背道而驰

得出结论:宏函数不能加分号,为了避免保证运算中合理的优先级,应该在外面和里面加上括号。


C++表示:这宏函数是在预处理直接展开成了表达式,不像普通函数还要建立栈帧。但是也忒麻烦了点,稍有不慎,结果就不正确了。

于是,C++引入了关键字inline 就是替代C语言中的宏函数。

inline

inline既然要替代,首先它要延续宏函数的优点:调用函数时不用创建栈帧,直接展开,还要优于宏函数:方便书写—— inline 直接在函数定义的 返回类型前加上即可。

inline int Add(int x, int y)//现在写个函数+inline就方便很多了
{return x + y;
}
int main()
{int b = Add(1,2);return 0;
}
inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展
开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁
调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
对于过长的函数作为内联函数,若也被频繁调用,此时已经不适合展开:比如下面这个场景:一个函数初次编译100条指令,编译完后成为一条指令。(在编译后的代码中,直接调用一个函数(尤其是在同一编译单元或模块内)通常涉及很小的开销,可能只是一条指令(比如一个跳转)。 )在函数在被复用时,就会执行被调用次的指令条数。

而如果编译器不阻拦这种展开,直接执行10000 * 100的指令,效率慢得可想而知。 

所以,inline适合短小、频繁调用的函数。

inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。

比如:

//F.h 声明
#pragma once
inline void f(int a);
//F.cpp 函数定义
#include "F.h"
#include <iostream>
using namespace std;
void f(int a)
{cout << a << endl;
}
//执行文件
#include "F.h"
int main()
{f(10);return 0;
}

如上述代码所示:我们把声明和定义放在两个文件

报错:  

内联函数编译器默认认为是不需要地址的,因为已经在调用地方展开了。在测试代码中,头文件展开,但是只有函数F的声明,找不到它的实现,导致调用地方展不开函数。

为什么找不到它的实现(展不开函数),因为在F.cpp中,虽然也包含了F.h,但是前面加了inline,默认是内联函数。这时候就不会把函数的实现地址放进符号表,导致测试代码中,无法链接到所调用函数的定义。

等到后面有更多的知识补充,我们会更好理解链接错误这一概念

总结: inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。

http://www.ds6.com.cn/news/79472.html

相关文章:

  • 广州网站备案公司天津seo托管
  • 设计师的个人网站网站推广排名哪家公司好
  • 建网站规则小程序开发需要多少钱
  • 网站开发前端兼职上百度推广的网站要多少钱
  • 做水果的b2b网站商丘seo教程
  • 外贸网站制作有哪些seo查询百科
  • 餐饮加盟网站制作关键词的作用
  • 房山广州网站建设seo还有前景吗
  • 锦州网站建设怎样个人免费推广网站
  • 学做ps的网站网站怎么优化搜索
  • 在运行 打开wordpress网站seo查询工具
  • 网站seo 工具google站长工具
  • 鲜花网站数据库建设重庆森林电影简介
  • 多个织梦dedecms网站怎么做站群搜索引擎yandex入口
  • 网页设置背景图片武汉seo优化代理
  • 网站ip域名查询百度识别图片找图
  • 东莞工业设计公司优质的seo快速排名优化
  • 成都专业建网站公司国外seo
  • 微信小程序可以做视频网站吗2021年经典营销案例
  • 开源企业cms建站系统潍坊网站建设平台
  • 教育网站怎么做广告投放怎么做
  • 网站框架有哪些百度导航和百度地图
  • 网站开发wbs实例电商代运营公司十强
  • 东莞长安做网站班级优化大师官方免费下载
  • 衡水哪儿专业做网站百度账号是什么
  • 做地方旅游网站目的意义免费的短视频app大全下载
  • 建立网站费用怎么做会计分录营销方法有哪几种
  • 上海网站制作多少钱爱站网综合查询
  • 如何重启网站服务器网络热词有哪些
  • 东营网站建设哪家好杭州seo网站优化