文章目录

  • 最会帽子的关键字 - extern
  • struct关键字
    • 空结构体多大
    • 柔性数组
  • union关键字
  • enum关键字
    • 枚举类型的使用方法
    • enum与#define的区别
  • typedef
    • 历史的误会 - 也许应该是typerename
    • typedef与#define的区别
    • #define/typedef unsigned
    • #define/typedef int [10]
    • typedef static int s_int

最会帽子的关键字 - extern

extern是专门用来声明变量和函数的关键字

当extern声明变量时,不可以初始化,也不可以省略。因为若是初始化的话,int n = 10就不是声明了而是定义,而定义是不能加extern的;若是省略extern的话,就无法清晰的知道int n究竟是定义了变量n无初始化,还是在声明n。

而extern声明函数时,是可以省略extern的,因为函数的定义是需要函数体的。而声明不需要,所以无论是否添加extern都可以清晰的知道该函数是在声明。但是为了和变量的声明具有统一性,所以函数的声明还是建议带上extern

struct关键字

空结构体多大

在vs2022中是不能够定义空结构体的

而在Linux下可以定义空结构体,结构体大小为0

其实,定义一个结构体,定义结构体时并不开辟内存,就相当于是制作了一个新的类型,用该类型创建变量时才会开辟内存。

结构体为空并无意义。vs2022直接禁止结构体为空,而Linux虽然可以定义空结构体,而我们也看到了该类型大小为0,用其类型创建变量时开辟的内存大小为0。

柔性数组

在c99标准下才存在柔性数组。

结构体的最后一个成员(成员数大于1)为未知大小的数组,该数组就是柔性数组.

可以看到该结构体的大小是int的大小,所以并没有计算数组arr的大小。

数组arr其实是紧跟在结构体后面的

union关键字

union称为联合或者是共用体,其大小为结构中最大的类型的大小。所以上面联合的大小为4,因为int大于char

而union结构中的所有的变量的地址都是相同的,是该联合的起始地址。

联合的空间是所以结构成员公用的

enum关键字

枚举类型的使用方法

enum类型的成员全都是常量,称为枚举常量,常量一般用全大写来表示,这些常量都是默认有数值大小的,默认从0开始。

而如果给这些常量赋予数值的话,就会从新数值开始往下递增。

enum与#define的区别

  1. #define宏常量是在预编译阶段进行简单替换;枚举常量则是在编译的时候确定其值。
  2. 一般在调试器里,可以调试枚举常量,但是不能调试宏常量。
  3. 枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

枚举能做到的事,#define能不能都做到?如果能,那为什么还需要枚举?

其实,#define是都能够做到的,但是若有很多个#define定义的宏,相互之间是没有任何相关性的,而用枚举则可以把这些具有相关性的集合起来。而且若有很多相关性的常量,如果用enum写的话还更简洁。

sizeof(enum类型)的值为多少?为什么?

答案是4。

其实enum类型就跟int类型非常的相似。只不过enum是把具有相关性的常量集合起来了。

enum的成员全都是常量,且有默认的值,这些值都是int。

其实可近似的认为enum的成员就是int。

typedef

历史的误会 - 也许应该是typerename

typedef一般理解为重命名的意思

格式:typedef name rename

对一般类型typedef

对结构体typedef

对指针typedef

对数组typedef

typedef与#define的区别

看上面的例子,可以看到typedef与#define有很多相似的地方,但其实本质上是完全不同的。

typedef只能是对类型进行重命名,而#define可以对任意的符号进行”重命名“。

并且,#define的宏定义是符号的完全替换,而typedef则相当于是重新制作了一个与name相同作用的rename类型。

看下面例子,正常情况下的int* a, b, c;只有a是指针,其它都是整型,这是语法规定的,可以理解为*先与a结合了,就变成了int (*a), _b, _c,当然了括号是实际不存在的。而#define的宏定义则只是完全的符号替换,INT_P与int*只是模样不一样,但是其本质完全一样,所以看结果,_a是指针,其它还是整型。而typedef则完全不同,它则相当于是制作了一个新的类型,该类型的作用就是定义指针变量,该类型能作用于a_, b_, c_,所以这三者全都是指针。

#define/typedef unsigned

对于typedef新的类型,编译器并不认识u_32 int的组合,所以改行报错而#define的完全替换,实际上还是unsigned int,所以改行不报错。

#define/typedef int [10]

#define是完全的字符替换,替换后就是int [10] arr1而语法中是不支持这样的。

typedef是把该数组的类型制作了下来,用该类型修饰arr2,则是完全没有问题的。

typedef static int s_int

其实,typedef是存储类型的关键字。虽然看不出typedef与存储有什么关系。

出现该报错的原因是:存储关键字不可以同时出现,也就是说,在定义一个变量的同时,只能有一个存储关键字出现。

extern、struct等关键字相关推荐

  1. C语言extern关键字定义外部变量--Redis源码extern使用

    在Redis2.8中有networking.c,这个文件没有networking.h networking.c首先引入redis.h这个头文件 #include "redis.h" ...

  2. Silverlight 控件开发记录之 extern alias” 关键字

    早在.net2.0, 微软就发布了"extern alias" C#关键字,目的就是为了解决在参照不同的Assembly时类型全名相同的问题. 以前还没觉得有多大的用处,但在做Si ...

  3. c 函数多次声明_【C语言】- static和extern关键字 - 对函数的作用!

    不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域.这篇小文介绍2个比较重要的关键字:static和extern. static和extern不仅可以用在变量上,还可以用在函数上.这讲先介绍 ...

  4. C语言关键字static与extern的详细解释

    参考原文地址(static):https://blog.csdn.net/keyeagle/article/details/6708077 参考原文地址(extern):https://www.cnb ...

  5. C++中extern关键字使用 http://blog.csdn.net/sruru/article/details/7951019

    C++中extern关键字使用 分类: C++ 语法 2012-09-06 15:37 327人阅读 评论(0) 收藏 举报 c++编译器 chapter 1 . extern关键字的作用 exter ...

  6. 关于C++的extern关键字

    一.extern关键字的作用 文件中定义的全局变量的可见性扩展到整个程序是在链接完成之后,而在编译阶段,他们的可见性仍局限于各自的文件. 编译器的目光不够长远,编译器没有能够意识到,某个变量符号虽然不 ...

  7. C# 关键字extern用法

    C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...

  8. char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...

    C语言中的关键字总共有32个:auto break case char const continue default do double else enum extern float for goto ...

  9. 如何使用extern在源文件之间共享变量?

    我知道C中的全局变量有时具有extern关键字. 什么是extern变量? 声明是什么样的? 它的范围是什么? 这与跨源文件共享变量有关,但是它如何精确地工作? 我在哪里使用extern ? #1楼 ...

最新文章

  1. 使用EXE4J将JAR包转换为EXE文件
  2. Java类之File记录
  3. getter/setter_Getters / Setters。 邪恶。 期。
  4. VUE中 ref $refs 使用详解,扩展到$parent 、$children 的使用
  5. 个人对于MySQL的理解_MySQL锁的理解
  6. 我的docker随笔12:docker源码编译
  7. 【二分法】计蒜客:气球消消乐
  8. 03月11日单应矩阵与鸟瞰图IPM变换
  9. 韦东山嵌入式学习视频完整目录
  10. java带圈数字,小1,小2
  11. 红外图像高低温校正【待补充】
  12. 一些实用型的工具及网站
  13. word表格边框消失怎么办_为什么我的word表格没了边框 - 卡饭网
  14. Laravel文档阅读笔记-How to use @auth and @guest directives in Laravel
  15. python论坛签到_Python 百度贴吧自动签到
  16. 公司中生存奥秘诙谐解说[ZT]
  17. 您应该遵循的15个UI测试自动化最佳实践(上)
  18. 【习题】《算法零基础100讲》位与 2
  19. 她 | papi酱的中场“战事”
  20. 复杂科学在创客教学研究中的应用

热门文章

  1. 岑村小学辅导班老师体会有感
  2. 微信小程序网易云音乐播放界面
  3. 机器视觉硬件——工业相机
  4. 【向生活低头】win10电脑使用录音机的注意事项
  5. php ini_get,ini_get - [ php中文手册 ] - 在线原生手册 - php中文网
  6. 180724 安卓-SSLPinning及反制
  7. excel文件导入hive乱码_hive 从Excel中导入数据
  8. 可靠传输的原理:停止等待协议、ARQ协议;TCP协议的可靠传输
  9. Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)
  10. 艾美捷测序级 II,纯化胰蛋白酶化验程序文献参考