各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
你好!在前面的文章中,我们探讨了计算机中数值是如何以二进制形式存储的,特别是了解了**补码(Two's Complement)**这种高效的表示方法,它统一了零的编码,并简化了加减运算。
今天,我们将继续深入计算机内存的世界,但这次我们将聚焦于变量的声明和管理。你知道吗?在C/C++等语言中,除了指定变量的数据类型(如 int
, char
, float
),我们还可以使用一些特殊的关键词来“限定”变量的属性或用途。这些关键词被称为类型限定符(Type Qualifiers)。
理解这些限定符,能帮助我们更好地与编译器“沟通”,影响变量的存储位置、可变性以及编译器对它的优化方式。本文将详细介绍 C/C++ 中常见的四种类型限定符:extern
、const
、volatile
和 register
,并通过代码示例展示它们的用法和效果。
1. extern
限定符:声明,而非定义
1.1 作用
extern
限定符用于声明一个变量或函数,表明它的定义(即实际分配存储空间和可能的初始化)在程序的其他地方(通常是另一个源文件)进行。它告诉编译器:“嘿,这个变量/函数是存在的,你会在链接阶段找到它,所以现在先别报错。”
1.2 特点
-
extern
只是一个声明,它不会在当前位置为变量分配内存空间。 - 因此,你不能在使用
extern
声明变量的同时进行初始化(除非这个初始化是针对一个已经在别处定义过的变量,但这种写法不常见且容易混淆)。尝试对一个只有 extern
声明但没有对应定义的变量进行访问或赋值,会在链接阶段出错。
1.3 代码示例
考虑有两个源文件:main.c
和 helper.c
。
文件:helper.c
// helper.c
#include <stdio.h>
// 在这里定义一个全局变量,并初始化
int external_variable = 100;
// 定义一个函数
void print_external_variable() {
printf("在 helper.c 中访问 external_variable: %d\n", external_variable);
}
文件:main.c
// main.c
#include <stdio.h>
// 使用 extern 声明 external_variable,告诉编译器它在别处定义
extern int external_variable;
// 使用 extern 声明 print_external_variable 函数
extern void print_external_variable();
int main() {
printf("在 main.c 中访问 external_variable (声明):%d\n", external_variable);
// 尝试修改 external_variable 的值
external_variable = 200;
printf("在 main.c 中修改后访问 external_variable:%d\n", external_variable);
// 调用在 helper.c 中定义的函数
print_external_variable();
// --- 错误示例:尝试在 extern 声明时赋值 (通常不允许或行为未定义) ---
// extern int another_var = 50; // 这一行通常会导致编译错误或警告,取决于编译器和标准
// printf("尝试在声明时赋值的变量:%d\n", another_var); // 如果上面没报错,这里也可能出错
// --- 错误示例:如果 external_variable 没有在任何地方