存储类别

C程序生成过程,预编译(宏处理),编译,汇编,链接  

链接属性:

  1.外部链接。

  2.内部链接,只在本翻译单元可见。

  3.无链接。

作用域:

  1.块作用域。

  2.函数作用域。

  3.文件作用域。

作用域和链接描述了标识符的可见性。存储器描述了标识符访问的对象的生存期。有四种存储期。

  1.静态存储期,运行期间一直存在.

  2.线程存储期,从声明到线程结束一直存在,使用关键字_Thread_local关键字,每个线程获得该变量的私有备份.

  3.自动存储期.

  4.动态分配存储期.

 

 

存储类别存储期作用域  链接声明方式
自动自动块内
寄存器自动块内,使用关键字register
静态外部链接静态文件外部所有函数外
静态内部链接静态文件内部所有函数外,使用关键字static
静态无链接静态块内,使用关键字static

 

声明在块或函数头中的任何变量都属于自动存储类别,为了更清楚的表达你的意图,(例如表明有意覆盖一个外部变量定义,或者强调不要把变量改为其他存储类别)可以显式使用auto关键字,

int main()
{
    auto int plox;
    return 0;  
}

但是在C++兼容的程序用不要使用auto,语义不同,C++中auto表示变量类型自动推导。

 

register关键字声明的变量更多像是一种请求,编译器根据寄存器或最快可用内存的数量衡量请求,或者直接忽略请求,如果忽然了请求,那么寄存器变量就变成了自动变量,即使是这样,仍然不能获取变量的地址(寄存器没有地址)。

int main(void)
{
   register int quick;
  return 0;
}

 

动态内存使用malloc()函数申请,使用free()函数释放,需要手动管理。

 

 

restrict关键字允许编译器优化某部分代码,它只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。restrict关键字有俩个读者,一个是编译器,该关键字告诉编译器可以自由假定一些优化方案。另外一个读者是用户,该关键字告知用户要使用满足restrict要求的参数。编译器不会检查用户是否遵循这一原则,但是无视它后果自负。

 

posted on 2019-06-04 00:10 好吧,就是菜菜 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/10970982.html

<think>我们在讨论typedef关键字在C/C++中如何影响存储类别或类型定义的行为。首先,需要明确typedef本身并不定义新的存储类别,而是为现有类型创建别名。存储类别(如auto、register、static、extern)用于指定变量的存储位置、生命周期和链接属性。 根据引用[1]和[2]: - typedef用于为现有类型创建新名字,目的是提高代码可读性和可维护性。 - 例如:`typedef struct { int num; int age; } Person;` 这里Person是结构体类型的别名。 关于存储类别: - 存储类别关键字(auto、register、static、extern)用于修饰变量,而typedef用于定义类型别名。 - typedef本身不带有任何存储类别属性,它只是为类型提供别名。当我们使用typedef定义的类型别名来声明变量时,该变量可以单独指定存储类别。 例如: ```c typedef int MyInt; // MyInt是int的别名 static MyInt count; // 这里count是静态存储类别的整型变量 ``` 在这个例子中,`static`是存储类别说明符,它修饰变量`count`,而`MyInt`只是类型别名,不影响存储类别。 引用[3]提到了存储类别的概念,包括作用域、链接和存储期。typedef定义的类型别名在声明变量时,可以配合存储类别说明符使用,但typedef本身并不改变这些属性。 另外,引用[2]中有一个例子: ```c typedef struct { int num; int age; }aaa,bbb,ccc; ``` 这里aaa, bbb, ccc都是同一结构体类型的别名。使用这些别名声明变量时,可以独立指定存储类别: ```c static aaa a1; // a1是静态存储类别的结构体变量 extern bbb b1; // b1是外部链接的结构体变量 ``` 总结: 1. typedef本身不指定存储类别,它仅仅创建类型别名。 2. 使用typedef定义的类型别名声明变量时,可以像使用原始类型一样,在变量声明前加上存储类别说明符(如static、extern等)。 3. typedef定义的类型别名的作用域和链接属性遵循一般标识符规则(取决于typedef声明的位置:在函数内部还是外部,是否使用static等),但这里要注意的是,typedef定义的是类型别名,而不是变量。 例如,在文件作用域内声明的typedef具有文件作用域,而在块作用域内声明的typedef则只在该块内有效。同时,typedef没有存储期,因为它是类型别名,不是变量。 因此,typedef不影响存储类别存储类别是变量属性,而typedef定义的是类型别名。 相关问题: 1. 在C语言中,存储类别说明符有哪些?它们分别有什么作用? 2. typedef和#define在定义类型别名时有何区别? 3. 如何理解C语言中类型别名的作用域和链接属性?</think>### typedef与存储类别的关联分析 在C/C++中,`typedef`关键字**不直接影响存储类别**,它仅用于创建类型别名。存储类别(如`auto`、`register`、`static`、`extern`)是变量声明的属性,而`typedef`定义的是**类型名称**而非变量。以下是关键点解析: #### 1. **typedef的本质作用** - `typedef`为现有类型创建新名称,不分配存储空间 - 示例: ```c typedef int MyInt; // MyInt是int的别名 typedef struct { int x; int y; } Point; // Point是结构体类型的别名 ``` 此时`MyInt`和`Point`只是类型标识符,不涉及存储类别[^1][^2]。 #### 2. **存储类别的应用场景** 存储类别仅适用于**变量声明**,使用`typedef`定义的类型别名在声明变量时可附加存储类别: ```c typedef struct Data { int id; } Data_t; static Data_t d1; // 静态存储期(文件作用域) extern Data_t d2; // 外部链接属性 auto Data_t d3; // 自动存储期(默认) ``` - 这里`static`/`extern`修饰的是变量`d1`/`d2`,而非`Data_t`类型本身[^3]。 #### 3. **typedef与存储类别的关键区别** | 特性 | typedef定义的类型别名 | 存储类别说明符 | |---------------|----------------------------|---------------------| | **作用对象** | 类型(如int, struct等) | 变量 | | **存储分配** | 不分配内存 | 控制变量的内存分配方式 | | **语法位置** | 独立声明(如全局/局部作用域)| 变量声明前 | | **示例** | `typedef int MyInt;` | `static int count;` | #### 4. 特殊注意事项 - **作用域规则**:`typedef`定义的类型别名遵循常规标识符作用域 ```c void func() { typedef float Real; // Real仅在func()内有效 static Real x; // 静态存储的float变量 } ``` - **结构体陷阱**(引用[2]): ```c // C++中以下两种声明等价 typedef struct { int a; } TypeA; // TypeA是类型别名 struct TypeB { int b; }; // TypeB可直接作为类型名 ``` > **核心结论**:`typedef`仅创建类型别名,存储类别是变量的属性。当使用类型别名声明变量时,可独立附加存储类别说明符,二者在语法和作用域上互不干扰[^1][^3]。 --- ### 相关问题 1. `typedef`和`#define`在定义类型别名时有何本质区别? 2. 在C++中,`using`关键字与`typedef`在类型别名定义上有哪些异同? 3. 如何理解C语言中`extern`关键字对跨文件变量声明的作用? 4. 为什么`register`存储类别在现代C/C++开发中极少使用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值