extern、struct等关键字
文章目录
- 最会帽子的关键字 - 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的区别
- #define宏常量是在预编译阶段进行简单替换;枚举常量则是在编译的时候确定其值。
- 一般在调试器里,可以调试枚举常量,但是不能调试宏常量。
- 枚举可以一次定义大量相关的常量,而#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等关键字相关推荐
- C语言extern关键字定义外部变量--Redis源码extern使用
在Redis2.8中有networking.c,这个文件没有networking.h networking.c首先引入redis.h这个头文件 #include "redis.h" ...
- Silverlight 控件开发记录之 extern alias” 关键字
早在.net2.0, 微软就发布了"extern alias" C#关键字,目的就是为了解决在参照不同的Assembly时类型全名相同的问题. 以前还没觉得有多大的用处,但在做Si ...
- c 函数多次声明_【C语言】- static和extern关键字 - 对函数的作用!
不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域.这篇小文介绍2个比较重要的关键字:static和extern. static和extern不仅可以用在变量上,还可以用在函数上.这讲先介绍 ...
- C语言关键字static与extern的详细解释
参考原文地址(static):https://blog.csdn.net/keyeagle/article/details/6708077 参考原文地址(extern):https://www.cnb ...
- 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 ...
- 关于C++的extern关键字
一.extern关键字的作用 文件中定义的全局变量的可见性扩展到整个程序是在链接完成之后,而在编译阶段,他们的可见性仍局限于各自的文件. 编译器的目光不够长远,编译器没有能够意识到,某个变量符号虽然不 ...
- C# 关键字extern用法
C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...
- char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
C语言中的关键字总共有32个:auto break case char const continue default do double else enum extern float for goto ...
- 如何使用extern在源文件之间共享变量?
我知道C中的全局变量有时具有extern关键字. 什么是extern变量? 声明是什么样的? 它的范围是什么? 这与跨源文件共享变量有关,但是它如何精确地工作? 我在哪里使用extern ? #1楼 ...
最新文章
- 使用EXE4J将JAR包转换为EXE文件
- Java类之File记录
- getter/setter_Getters / Setters。 邪恶。 期。
- VUE中 ref $refs 使用详解,扩展到$parent 、$children 的使用
- 个人对于MySQL的理解_MySQL锁的理解
- 我的docker随笔12:docker源码编译
- 【二分法】计蒜客:气球消消乐
- 03月11日单应矩阵与鸟瞰图IPM变换
- 韦东山嵌入式学习视频完整目录
- java带圈数字,小1,小2
- 红外图像高低温校正【待补充】
- 一些实用型的工具及网站
- word表格边框消失怎么办_为什么我的word表格没了边框 - 卡饭网
- Laravel文档阅读笔记-How to use @auth and @guest directives in Laravel
- python论坛签到_Python 百度贴吧自动签到
- 公司中生存奥秘诙谐解说[ZT]
- 您应该遵循的15个UI测试自动化最佳实践(上)
- 【习题】《算法零基础100讲》位与 2
- 她 | papi酱的中场“战事”
- 复杂科学在创客教学研究中的应用
热门文章
- 岑村小学辅导班老师体会有感
- 微信小程序网易云音乐播放界面
- 机器视觉硬件——工业相机
- 【向生活低头】win10电脑使用录音机的注意事项
- php ini_get,ini_get - [ php中文手册 ] - 在线原生手册 - php中文网
- 180724 安卓-SSLPinning及反制
- excel文件导入hive乱码_hive 从Excel中导入数据
- 可靠传输的原理:停止等待协议、ARQ协议;TCP协议的可靠传输
- Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)
- 艾美捷测序级 II,纯化胰蛋白酶化验程序文献参考