[C++学习]extern: 变量的声明与定义

描述

C++ 语言支持分离式编译机制,该机制允许把程序分割为多个文件,每个文件可以独立编译。例如:std::cout和std::cin,它们定义与标准库中,但是却能被我们的程序使用。所以,为了支持该机制,C++ 语言将声明与定义区分开来。

声明(declaration)使得名字为程序所知,如果一个程序想使用另外一个文件中的定义变量,则需要包含对那个文件的声明;定义(definition)创建与名字关联的实体。

使用方法

声明一个变量需要在变量前添加extern,并且不能显式的初始化变量。

extern int i; // 声明i,但没有定义
int j; // 声明并且定义j

任何包含显式初始化的声明即成为定义。

extern double pi = 3.14159; // 定义

示例

// 1.cpp
#include <iostream>

int i = 1;

void fun1()
{
    ......
}

// 2.cpp
#include <iostream>

extern int i;

int main()
{
	std::cout << i << std::endl;
	return 0;
}

结果:

linzijie@DESKTOP-3HKDU47:~/code$ g++ 1.cpp 2.cpp -o demo
linzijie@DESKTOP-3HKDU47:~/code$ ./demo
1

总结

  1. 如果要在多个文件中使用同一个变量,就必须将声明和定义分开;
  2. 任何包含显式初始化的声明即成为定义;
  3. 变量能且只能被定义一次,但是可以被多次声明;换言之变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却不能重复定义。
  4. 在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。

关于 extern "C"

#ifdef __cplusplus
 extern "C" {
 #endif
 
 // 代码

 #ifdef __cplusplus
 }
 #endif

被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。该说明可参考:https://blog.csdn.net/qq_30891813/article/details/87631651

posted @ 2019-09-17 13:44  Dumbledore  阅读(1398)  评论(0编辑  收藏  举报