ANSI C (4) —— 存储类别和类型限定

本文深入探讨了C语言中的存储类别,包括register、auto、extern、volatile和static,以及它们在内存管理和代码优化中的作用。此外,还讨论了C++中的extern用法、C与C++的混合编译以及const关键字在常量和指针中的应用。通过实例解析,帮助读者更好地理解和使用这些概念。
摘要由CSDN通过智能技术生成

register

寄存器(register)变量的被访问速率远远高于内存的被访问速率,所以编译优化常常这样做:将循环控制变量和使用频繁的变量安排在CPU的寄存器中。

通常,仅仅在块内声明寄存器变量。

取地址符&不能用于寄存器变量。
比如下面的代码将会发生错误: error: address of register variable ‘i’ requested

    register int i;
    for(i=0;i<10000;i++){
         if(i == 100){
             printf("this is 100.\n");
             printf("%p\n",&i);
         }
    }

auto

auto修饰的变量在离开自身的作用域后其占用的内存自动释放。事实上,大多数情况下我们用的变量都是auto类型的。

如果编译器不能或者不愿将程序员声明的register变量进行寄存处理,那么变量类型默认是auto类型的。

auto变量必须定义在函数体内

int sum(int a,int b){
    auto int s=a+b;  //仅仅在函数内可见
    return s;
}
auto int a=12;  //error: file-scope declaration of 'a' specifies 'auto'

extern

extern的用法 —— C++说明

extern告诉编译器,其声明的函数和变量的定义在别的文件中。
如果定义时没有初始化,系统在为其分配存储空间时,一次性初始化成0.
与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。

对于函数和变量而言,我们如果在本模块中extern声明了某一个函数或变量,那么编译器将会从其他文件中寻找这个函数或变量的定义,我们不用加上含有这个函数声明的.h文件。
extern.cpp:

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
    extern int get();
    cout<<get()<<endl;
    extern int a[5];
    int i;
    for(i=0;i<5;i++){
        cout<<a[i]<<endl;
    }
    return 0;
}

head.cpp

int get(){
    return 23;
}
int a[5] = {
  1,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值