C++ 编程基础(7)内存模型 | 7.3、存储持续性、作用域和链接


前言:

在C++编程中,理解变量的存储持续性、作用域和链接对于编写高效、可维护的代码至关重要。本文将详细介绍这三个概念,并通过示例说明它们在实际编程中的应用。

一、存储持续性、作用域和链接

1、存储持续性

存储持续性指的是变量在程序执行过程中存在的时间长度。C++标准定义了四种不同的存储持续性:

  • 自动存储持续性:变量在定义它的代码块(通常是函数或循环、条件语句等)执行时创建,在离开该代码块时销毁。例如:函数参数及函数内部定义的变量。
  • 静态存储持续性:变量在程序开始执行前分配内存,在程序结束时释放内存。例如:全局变量、静态局部变量(在函数内部定义,但用static修饰的变量)以及静态成员变量。
  • 线程存储持续性(C++ 11):变量在每个线程开始执行前分配内存,在线程结束时释放内存。使用thread_local关键字声明。例如:thread_local int c = 20;,变量c具有线程存储持续性。
  • 动态存储持续性:在堆上分配内存,直到显式释放。使用newdelete操作符。

2、作用域

作用域决定了变量在程序中的可见性。C++中主要有四种作用域:

  • 全局作用域:在所有函数外部声明的变量或函数具有全局作用域,它们在程序的任何地方都是可见的。
  • 局部作用域:在函数或代码块内部声明的变量具有局部作用域,它们仅在定义它们的函数或代码块内可见。
  • 块作用域:块作用域是局部作用域的一种特殊情况,由花括号{}包围的代码块定义。
  • 文件作用域:在单个文件内声明的静态变量或静态函数具有文件作用域,它们仅在该文件内可见。例如:static int fileVar = 50;,变量fileVar仅在当前文件内可见。

3、链接

链接决定了变量或函数在不同文件之间的可见性。C++中有三种链接类型:

  • 外部链接:具有全局作用域的变量或函数具有外部链接,它们可以在其他文件中通过extern关键字访问。例如:全局变量、函数。
  • 内部链接:使用static关键字声明的全局变量或函数具有内部链接,它们仅在定义它们的文件内可见。
  • 无链接:局部作用域和块作用域的变量以及某些特定的实体具有无链接,它们不能在定义它们的代码块或文件之外访问。

注意:在匿名命名空间内定义的变量不具有连接性。

4、函数与链接性

  • 外部连接性

默认情况下,C++函数具有外部链接性,这意味着它们可以在不同文件之间共享和调用。外部链接性的函数可以在一个文件中定义,并在另一个文件中声明和使用。例如:

// file1.cpp
void output(const std::string &str)
{
    std::cout << str << std::endl;
}

// main.cpp
// 使用extern关键字,声明output函数是在别处定义的
extern void output(const std::string &str);

int main() {
    output("hello world!");
    return 0;
}
  • 内部连接性

通过使用static关键字,可以将函数的链接性设置为内部,使其只能在定义它的文件中使用。这有助于避免命名冲突,并限制函数的作用范围。

#include <iostream>

static void internalFunction() {
    std::cout << "This is an internal function." << std::endl;
}

void callInternalFunction() {
    internalFunction();
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值