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

wordpress 导航高亮百度网站优化

wordpress 导航高亮,百度网站优化,网件路由器做网站,石家庄今天又发现一例本文首发于 ❄️慕雪的寒舍 简单介绍C/C中static关键字和extern关键字的作用。 1.简介 在之前的博客中,提到过static的三个作用,但是没有详细说明这三个作用的场景,现在回过头来记录一下。 修饰函数修饰全局变量修饰函数内变量 static还有…

本文首发于 ❄️慕雪的寒舍

简单介绍C/C++中static关键字和extern关键字的作用。

1.简介

在之前的博客中,提到过static的三个作用,但是没有详细说明这三个作用的场景,现在回过头来记录一下。

  1. 修饰函数
  2. 修饰全局变量
  3. 修饰函数内变量

static还有一个隐藏的特性,即变量会被默认设置为0,因为静态区/全局区的内存区域在初始化的时候都是0。

在C++的类和对象中,static还多了一个作用,即修饰C++类的成员变量或函数。被修饰的成员属于整个类,可以直接通过类的作用域来访问(前提是公有),这不是本文的重点。

2.static修饰函数/变量

对于修饰函数和变量而言,作用基本是一致的,即限制这个函数/变量的作用域,让他只对当前文件可见。

修饰变量

给定下面两个文件

// a.cpp
int aGlobal = 10;
static int bGlobal = 20;
// b.cpp
#include <iostream>
using namespace std;// 声明文件a.cpp中的全局变量
extern int aGlobal;int main()
{cout << aGlobal << endl;return 0;
}

b.cpp中,使用了extern关键字来声明属于另外一个cpp文件中的全局变量,用如下命令编译成可执行文件test。

g++ b.cpp a.cpp -o test

在Ubuntu上进行测试,编译成功,运行能成功打印出10,符合预期。

❯ g++ a.cpp b.cpp -o test
❯ ./test
10

而被static修饰过的bGlobal就不能用这种方式被另外一个文件访问了。

// b.cpp 修改后
#include <iostream>
using namespace std;// 声明文件a.cpp中的全局变量
extern int bGlobal;int main()
{cout << bGlobal << endl;return 0;
}

使用相同的命令进行编译,此时就会报错了。因为static关键字将bGlobal这个全局变量的作用域限制在了a.cpp文件中,其他文件无法访问!

❯ g++ a.cpp b.cpp -o test
/usr/bin/ld: /tmp/ccj43Xl9.o: warning: relocation against `bGlobal' in read-only section `.text'
/usr/bin/ld: /tmp/ccj43Xl9.o: in function `main':
b.cpp:(.text+0xa): undefined reference to `bGlobal'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status

这里有个必须要注意的点,我们在b.cpp中并没有#include "a.cpp",如果添加了include,那么上面的结论就无效了。因为include会在预编译期间被展开,此时a.cpp中的全局变量定义直接被添加在了b.cpp上面,并不属于两个文件的情况。比如下面的代码就可以正常编译通过。

// 错误的测试逻辑
#include <iostream>
#include "a.cpp" // 引用了a.cpp
using namespace std;// 声明文件a.cpp中的全局变量?此时a.cpp都已经被展开了,完全不是另外一个文件了!
// extern int bGlobal; // 这一行加不加没有任何区别int main()
{cout << bGlobal << endl;return 0;
}

如下所示,编译成功且打印了bGlobal的值

❯ g++ b.cpp -o test
❯ ./test
20

注意这里编译的时候不能再添加a.cpp了,因为此时已经被展开到了b.cpp之前,如果这样编译就会报错aGlobal重定义。

❯ g++ a.cpp b.cpp -o test
/usr/bin/ld: /tmp/cckcj9a5.o:(.data+0x0): multiple definition of `aGlobal'; /tmp/ccsNnuaN.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status

修饰函数

修饰函数的作用同理,没有修饰的函数可以被另外一个文件extern后调用,修饰后的不可以。

// a.cpp
int Add(int a,int b){return a+b;
}
// b.cpp
#include <iostream>
using namespace std;// 声明文件a.cpp中的函数
extern int Add(int,int);int main()
{cout << Add(10,20) << endl;return 0;
}

编译成功,且调用Add函数成功。

❯ g++ a.cpp b.cpp -o test
❯ ./test
30

Add函数添加了static后就无法被extern调用了

❯ g++ a.cpp b.cpp -o test
/usr/bin/ld: /tmp/ccFe9oSW.o: in function `main':
b.cpp:(.text+0x13): undefined reference to `Add(int, int)'
collect2: error: ld returned 1 exit status

3.static修饰函数内变量

你可能见过这样的写法,在函数内定义一个static变量,并作为返回值

char* Add(int a,int b){static char arr[2];arr[0] = (char)a + '0';arr[1] = (char)b + '0';return arr; 
}

使用static修饰函数内的变量后,这个变量的作用域不再是函数体内了,而是扩展到了全局(可以理解为他就是一个全局变量)。

这种方式可以避免使用动态内存管理(malloc/free)的空间作为返回值,因为那样可能会出现内存泄漏问题。比较常见的一个应用就是linux下的inet_ntoa函数,这个函数可以将IP地址的结构体转为IP的字符串,其内部就是用static的char数组作为返回值的,这也是为什么该函数不能在printf中连续调用,会导致后续的调用覆盖前面的结果。

如果有函数是利用static作为返回值传参的,则应该用另外一个变量拷贝来保存这个结果,再执行下一次调用。

需要注意的是,static的这一行定义只会在第一次进入函数的时候执行,后续不再会执行。比如下面的代码,如果你对static修饰的作用不太了解,你可能会认为isGood这个变量每次进入该函数都会被设置为false,从而只会让他进入if判断体的A区域,搞得这个if判断都没有意义了。

void TestFunc(){static bool isGood = false;if(!isGood){// A...} else {// B...}
}

但实际上,这个变量只有第一次调用这个函数的时候会被创建且赋值为false,后续不再会执行static这一行,所以函数体内(A区域和B区域可能会做一些处理再设置isGood变量的值)对isGood值的修改会沿用到下一次调用这个函数!

4.static和编译

为什么被static修饰的函数/变量不会被其他文件看见?

因为在生成符号表的时候,每一个static变量即便变量名相同,也会生成不同的符号表项。所以在链接阶段符号表合并的时候,并不会将两个文件中同名的static变量合并在一起,所以其他文件也就没有办法访问到当前文件中被static修饰的函数/变量。

而extern了一个static变量,就会因为符号表无法找到,而链接失败。注意观察G++的报错,都是ld和.o相关字样的,说明这个并不是编译器通过语法检查出来的错误,而是在链接.o目标文件的时候,发现无法链接该变量的时候因为错误而退出编译的。

❯ g++ a.cpp b.cpp -o test
/usr/bin/ld: /tmp/ccj43Xl9.o: warning: relocation against `bGlobal' in read-only section `.text'
/usr/bin/ld: /tmp/ccj43Xl9.o: in function `main':
b.cpp:(.text+0xa): undefined reference to `bGlobal'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
http://www.hkea.cn/news/509953/

相关文章:

  • 深圳市做网站百度seo排名点击器app
  • 五莲网站建设维护推广网络营销推广及优化方案
  • 重庆网红整站多关键词优化
  • 动易网站cms一级消防工程师考试
  • wordpress更新报错想找搜索引擎优化
  • 提供网站建设费用资源网
  • wordpress怎么使用主题seo优化评论
  • 柳州做网站如何建网站详细步骤
  • 黄岛做网站哪家好四川seo关键词工具
  • dede门户网站模版写软文推广
  • 网站开发者排名开发一个app平台大概需要多少钱?
  • 做网站 博客百度推广助手客户端
  • 温州市手机网站制作哪家好爱站网长尾词挖掘
  • 党委网站建设要求凡科建站靠谱吗
  • wordpress 安卓客户端福建seo优化
  • 襄阳seo技术长沙seo网站优化
  • 做一的同志小说网站做seo要投入什么
  • 网站的文件结构百度搜索排名怎么收费
  • 全景网站app网络营销工具分析
  • 南京建设工程交易中心网站seo是什么的简称
  • 利用vps做网站关键字排名查询
  • 常熟网站制作找哪家好品牌型网站制作价格
  • 怎么做自己网站推广网络广告
  • 化州网站建设促销方法100种
  • 长沙专业网站设计平台新闻最新消息10条
  • 惠州网站建设制作宣传推广方案
  • 宁波网站推广外包服务长岭网站优化公司
  • 哈尔滨市哪里做淘宝网站seo课程心得体会
  • 做网站建设公司企业一个企业该如何进行网络营销
  • 移动端h5网站开发服务企业seo推广