✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
31. extern 和 static/const 的区别
extern 和 static 是不兼容的,即不能同时加到同一个变量前面。定义了 static 的变量会被存储在全局变量区,并且声明的同时也进行了定义。而 extern 它仅仅是声明该变量,可能会出现在其他模块中。
extern 和 const 是兼容的,即可以同时加到同一个变量前面。const 和 static 一样,定义的变量只能在本模块中使用,但是 const 加上 extern 后是可以去其他模块寻找该变量的。
32. 多个文件中如何共用一个全局变量
例子:
头文件:state.h 源文件:state.cpp
其它源文件:t1.cpp t2.cpp t3.cpp,这些源文件都包含头文件 state.h。
需要定义一个全局变量供这些源文件中使用:方法如下
1、在 state.h 声明全局变量:extern int a;
2、在 state.cpp 中定义该全局变量:int a =10;
这样其它源文件就可以使用该变量啦~
这里需要的是 “声明”,不是 “定义”!根据 C++ 标准的规定,一个变量声明必须同时满足两个条件,否则就是定义:
(1) 声明必须使用 extern 关键字
(2) 不能给变量赋初值
extern int a; //声明
int a; //定义
int a = 0; //定义
extern int a = 0; //定义
33. 如果没有 extern "C" 的话,它编译出来的结果会有什么不一样吗?
-
名字修饰:C++ 编译器会对函数名进行修饰(name mangling)以支持函数重载和命名空间等 C++ 特性。这意味着 C 库函数的原始函数名会被修改,可能会在函数名中增加一些附加信息。这样可能导致在链接时找不到对应的函数。
-
链接错误:由于函数名被修饰,C++ 代码中调用 C 库函数时会使用修改后的函数名,而 C 库中只包含原始的未修饰函数名。因此,在链接阶段可能会出现链接错误,指示找不到符号。
-
类型不匹配:C 语言中不支持函数重载,因此 C 库中的函数通常是非重载的,使用 C 的调用约定。在 C++ 中,默认为 C++ 调用约定,分析函数参数和返回值的方式可能与 C 调用约定不同。这可能导致在 C++ 代码中调用 C 库函数时,参数传递、返回值和栈帧布局等方面出现不兼容的问题。
总之,缺少 extern "C"
可能导致 C++ 代码无法正确调用 C 库函数,出现链接错误、命名冲突等问题。使用 extern "C"
可以告诉 C++ 编译器按照 C 的方式进行链接和命名,以确保 C++ 代码与 C 库能够正确地集成和调用。