目录
了解函数的声明与定义:
声明: 是用来告诉编译器变量的名称和类型,而不分配内存
定义: 是为了给变量分配内存,可以为变量赋初值。
头文件:
<>: 编译器的安装目录的标准库中开始查找
" ": 会在当前的工程所在的文件夹开始寻找, 找不到再去标准目录查找
在同一个文件夹中只能将同一个头文件包含一次
解决方案: 预处理器编译指令 #ifndef 避免头文件多次包含
数据存储持续性、作用域、链接性:
- 自动存储持续性:在函数定义中声明的变量(包括函数形参)的存储连续性为自动。它们在程序开始执行其所属的函数或者代码块是被创建,在执行完函数或代码块时,它们使用的内存被释放。C++有两种存储持续性为自动的变量。
- 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量。它们在程序运行过程中都存在。C++有三种这样的变量。
- 动态存储持续性:用new运算符分配的内存,在使用delete释放之前一致存在。同时也可以被称为自由存储(free store)或堆(heap)。
- 线程存储性(C++11): CPU同时处理多个执行任务, 这让程序能够计算放在可并行处理的不同线程中。如果使用关键字thread_local声明的, 则其生命周期与所属的线程一样长。
静态持续变量分为哪三种:
创建链接性为外部的静态持续变量(可在其他文件中访问): 必须在代码块的外面声明它,
链接性为外部的也称全局变量 (关键字: extern)
创建链接性为内部的静态持续变量 (只能在当前文件中访问): 必须在代码的外面声明它, 并使用static限定符,
创建没有链接性静态持续变量 (只能在当前函数或代码块中访问): 必须在代码的内部声明它, 并使用static限定符
const链接性为内部的: 如果希望常量的链接性为外部的, 则必须使用extern关键字来覆盖默认的内部链接性,鉴于当个const在多个文件之间共享, 因此只有一个文件可对其进行初始化
链接性的含义: 描述了名称如何在不同单元间共享。链接性为外部的名称可以在文件间共享, 链接性为内部的名称只能由一个文件中的函数共享。自动变量的名称没有链接性,因为他们不能共享
extern讲解:
- 修饰全局变量:在声明全局变量的时候使用extern修饰变量,表明该变量定义于其他翻译单元。
- 修饰全局常量:表明该全局常量拥有外部链接(可以被其他翻译单元发现),否则全局常量默认是只有内部链接,即不可被其他翻译单元发现。
- 修饰局部变量:表明该局部变量在其他翻译单元中被定义,需要在链接的时候去解析。
- 修饰一个字符串:形如extern “C” 之类的用法大家肯定见过了,表明后接的代码块(或者后接的声明)使用C语言调用惯例。
- 修饰一个模板:表明该模板已经在其他翻译单元实例化,不需要在这里实例化。
CODE:
// file1.cpp
#include <stdio.h>
/*定义两个全局变量*/
int x = 1; // 声明, 也是定义
int y = 2; // 声明, 也是定义
extern int z = 10; // 声明, 也是定义 extern 可以省略
extern const int w = 100; // 声明, 也是定义 extern 可以省略
extern int addtwonum(); // 声明, 也是定义 extern 测试了可以省略
int main(void)
{
int result;
result = addtwonum();
printf("result 为: %d\n", result); // 3
printf("z 为: %d\n", z); // 10
printf("w 为: %d\n", w); // 100
return 0;
}
//file2.cpp
#include <stdio.h>
/*外部变量声明*/
extern int x; // 声明, 不是定义 extern 不可以省略, 不要定义, 否则报错
extern int y; // 声明, 不是定义 extern 不可以省略, 同上
extern int z; // 声明, 不是定义 extern 可以省略
extern const int w; // 声明, 不是定义 extern 不可以省略
int addtwonum() // 函数默认是外部链接
{
return x + y;
}
名称空间:
CODE:
#include <iostream>
using namespace std;
namespace A // 默认情况下, 名称空间链接性为外部放入
{
double pail;
void fetch()
{
cout << "hello world" << endl;
};
}
namespace B
{
double pail = 43.21;
struct Hill
{
int x;
};
}
void test()
{
using namespace A;
cout << "pail = " << pail << endl; // 12.34 作用域函数体内部
}
int main(void) {
A::pail = 12.34;
cout << "A::pail = " << A::pail << endl; // 12.34
cout << "B::pail = " << B::pail << endl; // 43.21
test();
//cout << "pail = " << pail << endl; // 报错 没有限定符, 不知道是哪一个
B::Hill mole;
A::fetch(); // hello world
}
名称空间参考:C++ 名称空间_xiaogangjava的博客-CSDN博客_c++名称空间
extern用法可以参考: C语言extern详解必懂_我想变成五条悟的博客-CSDN博客_extern