C++ Primer 内存模板和名称空间(九)

目录

了解函数的声明与定义:

头文件:

数据存储持续性、作用域、链接性:

静态持续变量分为哪三种:

extern讲解:

名称空间:


了解函数的声明与定义:

声明: 是用来告诉编译器变量的名称和类型,而不分配内存

定义: 是为了给变量分配内存,可以为变量赋初值。

头文件:

<>: 编译器的安装目录的标准库中开始查找

" ": 会在当前的工程所在的文件夹开始寻找, 找不到再去标准目录查找

在同一个文件夹中只能将同一个头文件包含一次

解决方案: 预处理器编译指令 #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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值