一、变量声明extern解析
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。您可以使用 extern 关键字在任何地方声明一个变量。虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
二、变量声明和定义的区别
1、变量声明
①定义:声明是告诉编译器某个变量的名字和类型,但并不为其分配内存。
②示例:
extern int x;// 声明变量x,但未定义
③用途:声明通常用于告诉编译器该变量将在其他地方定义,或在多个文件之间共享。
2、变量定义
①定义:定义不仅声明一个变量,还分配了内存空间给它,并初始化(可选)。
②示例:
int x;// 定义变量x,并分配内存
③注意:每个变量只能被定义一次,但可以被声明多次。
示例代码:
#include <iostream>
extern int a; // 声明a
int main() {
int b = 5; // 定义b
std::cout << b << std::endl;
return 0;
}
int a = 10; // 定义并初始化a
三、适用场景
1、如果你只需要通知编译器变量的存在,可以使用声明。
2、如果你需要创建这个变量并为其分配内存,则需要进行定义。
四、在QT中,成员变量和extern声明方式的区别
1、作用域
① 成员变量属于类的一部分,其作用域限定在类的范围内。这意味着成员变量可以被类的任何成员函数访问,而且每个类的实例(对象)都有其自己的成员变量实例。
② extern声明的变量通常用于在一个文件中声明一个在另一个文件中定义的全局变量,或者在当前文件中引用一个其他文件中定义的全局变量。它们的作用域从声明点开始,直到文件结束或者另一个extern声明出现为止。
2、存储位置
①成员变量通常存储在对象实例的内存中,每个对象有自己的一份成员变量。
②extern声明的变量指示编译器在其他地方定义的变量的存在,实际的变量存储位置由定义的地方决定。
3、使用方式
①成员变量通过类的对象或指针进行访问,通常使用.或->运算符。
②extern声明的变量通过直接使用变量名来访问,因为它们在声明点之后的作用域内可见。
五、使用extern关键字的好处
1、避免重复定义
当你希望在多个源文件中使用同一个全局变量或函数时,必须将其声明为 extern。这样做可以避免在每个文件中重复定义相同的全局变量或函数,从而避免冲突和编译器错误。
2、跨文件共享变量和函数
使用 extern 可以在一个源文件中声明变量或函数,然后在其它文件中定义这些变量或函数。这种方式允许不同的源文件共享相同的全局变量或函数接口,实现模块化的编程。
3、提高程序的可维护性
通过将变量和函数的声明与定义分离,可以使代码更清晰和模块化。每个源文件只需关注自己的实现细节,而不需要担心全局变量或函数的定义和声明。
4、优化编译时间
如果一个变量或函数在多个文件中使用,但只在一个文件中定义,编译器只需处理一次该变量或函数的定义。这可以显著减少编译时间,特别是在大型项目中。
综上所述,extern 关键字的主要作用是允许变量或函数在一个文件中声明而在另一个文件中定义,从而实现模块化设计、避免重复定义,并提高程序的可维护性和编译效率。
六、C++中extern关键字的作用
参考:https://zhuanlan.zhihu.com/p/621416882
在较小的项目或者单一文件的程序中,确实可能感觉到 extern 的用处不是很大,因为此时全局变量和函数可以直接在所有文件中访问和定义。然而,在更大型的项目或者多文件程序中,extern 的作用变得更为显著和必要。以下是一些更具体的情况和场景,展示了 extern 的实际用途:
分离声明和定义:
在大型项目中,往往会将不同的功能模块分开放置在不同的源文件中。使用 extern 可以在头文件中声明全局变量或函数,而在对应的源文件中定义它们。这样做可以使代码更模块化和清晰,减少重复代码。
共享全局变量:
如果多个源文件需要访问和修改同一个全局变量,可以使用 extern 在头文件中声明该变量,然后在一个源文件中定义它。其他文件只需通过 extern 声明来引用该变量,而无需重新定义,避免了重复定义和冲突。
跨文件调用函数:
类似地,如果多个文件需要调用同一个函数,可以在头文件中声明该函数,然后在一个文件中实现它。其它文件通过 extern 声明来引用该函数,实现了代码的分离和功能的模块化。
编译优化:
当使用 extern 声明一个变量或函数时,编译器可以更好地优化编译过程。它可以跳过多余的重复定义检查和处理,只需要处理一次定义,提高了编译效率,特别是对于大型项目。
库文件和接口:
在开发库文件或者接口时,extern 可以用来声明库中的全局变量或函数接口,以供外部程序使用。这种方式使得库的实现细节与使用者分离,提高了代码的封装性和可维护性。
总结来说,虽然在小型项目或单文件程序中可能感觉不到 extern 的显著用处,但在大型程序或多文件项目中,它是一种重要的编程技术,有助于提高代码的模块化程度、可维护性和编译效率。