既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
**专栏中的文章都是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!**专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2:
VC++常用功能开发汇总https://blog.csdn.net/chenlycly/article/details/124272585
专栏将10多年C++开发实践中常用的功能,以高质量的代码展现出来,并对相关功能的实现细节进行了详细的说明。这些常用的代码,其质量与稳定性是有保证的,可以直接拿过去使用,可以有效地解决C++软件开发过程中遇到的问题。
专栏3:
C/C++基础与进阶https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!
1、概述
static和exrern是C语言中的关键字,C++语言中在处理C++类时做了一定的延伸。extern用来声明外部全局变量,static可以用来声明变量、全局函数及C++类的静态函数。
这次遇到这个编译的问题,我特意翻看了谭浩强老师的 <<C语言程序设计>> 一书,书中对extern和static两关键字有详细的说明。有多年开发经验后再回过头去看这本书,才理解很多上学时理解不了的内容,才感叹书中对extern和static关键字的表述是多么的精准到位,也许这就是这本书最经典的原因吧!现在回过头去看,基础知识确实比较重要啊!正是这本书中关于extern和static精准到位的表述,才破解了我们心头的疑惑,顺利地解决了这次遇到的编译问题。
下面我们就来通过这个问题来详细讲述一下static和exrern两关键字的相关内容。
2、编译C++代码时遇到的变量及函数重复定义的问题
同事在一个头文件中增加了一个外部变量g_szLogFileName,如下所示:
想把这个外部变量当成全局变量来使用,结果启动编译后报出了该变量重复定义的错误:
在一个头文件中定义一个变量,在多个cpp中多次包含这个头文件,则会提示变量重复定义的问题。
后来看到下面的WriteWbLog接口也在头文件中,这个头文件被多个cpp包含(就像将代码拷贝过去编译一样),**为啥这个接口没有报多次被定义的问题呢?难道是因为WriteWbLog函数前面有个static关键字?**于是手动在g_szLogFileName变量前添加一个static,结果编译就不再报错了。如果将WriteWbLog函数前面的static去掉,编译就会报错:
提示WriteWbLog函数多次被定义的问题:
LNK2005 “void __cdecl WriteWbLog(wchar_t const *,…)” (?WriteWbLog@@YAXPB_WZZ) 已经在 entitytracker.obj 中定义 E:\XXXXXX\CElectronicPenCore.obj
这里面牵涉到C语言中的几个概念:
1)外部变量与全局变量的区别;
2)C语言中static的作用;
3)C语言中extern关键字的作用。
3、用 extern 声明外部变量
关于extern关键字,谭浩强老师的<<C语言程序设计>>中有一段精准而到位的表述:
外部变量(即全局变量)函数外部定义的变量,它不属于哪一个函数,它属于一个源程
序文件。其作用域是整个源程序。**外部变量实在函数外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。**如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
文中给出了示例代码:用 extern 声明外部变量,扩展程序文件中的作用域。
int max(int x,int y)
{
int z;
z = x > y ? x : y;
return(z);
}
int main()
{
extern A,B;
printf("%d\n",max(A,B));
return 0;
}
int A=13, B=-8;
假设这段代码放置在cpp中,int型变量A和B在cpp文件结尾定义的,它们的组用域从它们定义处到cpp文件结束。如果不在main函数中用extern声明一下这两个变量,因为不再这两个变量的作用域内,所以不能直接使用的。
如果定义的全局变量需要在多个cpp文件中使用,需要在一个公用的头文件用extern关键字声明一下这些全局变量,使用到这些全局变量时,只需要包含这个头文件即可。比如在VS创建的工程中一般都有个stdafx.h头文件,所有的cpp文件都需要包含这个头文件,所以可以在stdafx.h头文件中使用extern声明全局变量,也可以在一个公用的头文件(比如common.h)使用extern去声明,然后在使用到全局变量的cpp文件中包含stdafx.h头文件或者公用头文件(比如common.h)就可以了。
比如在头文件中使用extern声明:
extern BOOL g_bFileLogOn;
在cpp文件中对变量进行定义并初始化:
BOOL g_bFileLogOn = FALSE;
头文件可能会直接被多个cpp文件包含,或者间接的被多个cpp文件包含(比如在file-a.h头文件使用extern声明了全局变量,然后file-b.h中包含了file-a.h头文件,然后多个cpp文件包含了file-b.h头文件,即file-a.h被多次间接包含),所以会出现多次被extern声明的情况,声明多次是可以的,但定义只能有一次,否则就是重复定义了。
4、extern与全局函数
对于全局函数, extern关键词的声明是可有可无的,因为函数本身不加修饰的话就是extern的。在引用全局函数时需要函数声明,可以直接声明函数,也可以使用#include去包含函数声明的头文件,比如:
int AddNum( int a, int b)
int main()
{
extern A,B;
printf("%d\n",max(A,B));
return 0;
}
int AddNum( int a, int b)
{
int nSum = a + b;
retrun nSum;
}
一般我们公用函数或者使用频繁的函数封装到一个.h文件和.cpp中,函数的声明放置在.h头文件中,函数的实现放在.cpp,要使用全局函数,只要包含对应的.h头文件即可。
5、为何在变量和函数前添加一个static关键字编译就没问题了呢?
在 C 语言中,**对于被声明为 static 的全局实体(包括变量和函数),在声明它的文件之外是不可见的。**这句话来自于C++ Primer一书,如下所示:
**在C语言编程中,static的一个作用就是信息屏蔽。**比方说,你自己定义了一个文件,该文件中有一系列的函数以及变量的声明和定义,你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。所以,在不同文件中定义同名的staitc函数是没问题的,不会冲突的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!