标签 博客 下的文章

走马观花ANSI C标准-类型

类型(type)

1、类型分为:
   a) object type — types that fully describe objects
   b) function type — types that describe functions
   c) uncomplete type — types that describe objects but lack information needed to determine their sizes,如void

2、在C99中加入了布尔类型_Bool,其定义为大小足够容纳0和1的类型。检查一下手头的编译器发现GCC 3.4.3支持_Bool,而Microsoft C/C++  Version 12.00.8168(VC6.0)则不支持。

3、char类型被定义为:大小足以容纳任何一个“basic execution charactor set”中的字符。如果任何一个“basic execution charactor set”中的字符存储在一个char中,它的值可以保证为“positive”;其他字符存储在一个char中,其值要根据具体的实现定义了。

4、标准定义了5个有符号整型:signed char, short int, int, long int, and long long int。当然各个不同的实现可以定义自己的扩展有符号整型。我们常说的有符号整型指的是标准的和扩展的统称。一个signed char占用的内存空间和一个"plain" char相同。一个"plain" int拥有执行环境架构建议的“自然大小”。区间在[INT_MIN, INT_MAX](in limits.h)

5、每一个标准定义的有符号整型都对应着一个unsigned int type, 它们称为标准无符号整型。它们占据的内存空间与有符号整型相同。和有符号整型一样,各个不同的实现定义了相关的扩展无符号整型。它们放在一起统称为“无符号整型”。

6、标准定义了3个“浮点实型”,分别为:float , double , long double。float的值的范围是double值范围的子集,同样double的值的范围是long double值范围的子集。

7、char type, signed int和unsigned int types, float type被统称为"basic types"。枚举是一个整型常量的集合。char type, signed int和unsigned int types和枚举统称为integer types。integer types和real floating types统称为"real types"。

8、void是个典型的uncomplete type,而且不能被completed;一个没有指定size的数组类型也是uncomplete type,但是却可以被completed。

9、到目前为止,以上提到都是"unqualified type", 每个"unqualified type"都有若干个qualified type. 通过与几个qualifiers : const、volatile、restrict的组合即可。

走马观花ANSI C标准-标识符

标识符(identifier)

1、一个标识符可以表示:
a) 对象(object)
b) 函数(function)
c) 结构体(struct)的标签(Tag)[注1]
d) 结构体的成员
e) 联合体(union)或枚举类型(enumeration)
f) 类型别名(typedef)
g) 标签(label)
h) 宏(macro)
i) 宏参数(macro parameter)
同一个标识符在程序的“不同点”处可以表示不同的“实体”(entity)。[注2]
一个枚举(enumeration)的成员被称为一个“枚举常量,enumeration constant”。

2、作用域(Scope)
Scope共定义了四种:
a) 函数作用域(function)
b) 文件作用域(file)
c) 块作用域(block)
d) 函数原型作用域(function prototype)

标签名(label name)是唯一一个拥有“函数作用域”的标识符。它可以用在它所在函数内的任何位置。

标识符拥有的作用域取决于它声明时的位置。
如果标示符声明在任何块(block)或者函数定义的参数列表外的话,那么它拥有“文件作用域”,它的作用域同所在“翻译单元”;
如果标示符声明在任何块(block)或者函数定义的参数列表内的话,那么它拥有“块作用域”,它的作用域同所在“块”;
如果标示符声明在函数原型的参数列表内的话,那么它拥有“函数原型作用域”,它的作用域同所在的“函数原型”。

一个原则:“内层作用域,inner scope”的标识符会隐藏(hide)“外层作用域,outer scope”的标识符。

3、标识符的链接(linkages of identifiers)
在不同Scopes或者同一个Scope下声明不止一次的标识符,进程会将它们参考到(refer to)同一个object或function,这就被称为“linkage”。注意:在不同的标识符之间没有linkage可言。
标准定义了3种linkage:
   a) external
   b) interal
   c) none

1) 在组成一个完整程序的“翻译单元”和“库”中,拥有external linkage的标识符指示同一个object or function;
2) 在一个“翻译单元”内,拥有internal linkage的标识符指示同一个object or function;
3) 一个“文件作用域”的标识符,如果前面有“static”修饰,那么该标识符拥有“internal linkage”;
4) 一个没有任何存储类型(storage-class)修饰的函数标识符与使用extern修饰的函数标识符的linkage相同;
5) none linkage情况:
   a) 一个被声明为既不是object又不是function的标识符;
   b) 一个被声明为函数parameter的标识符;
   c) 一个被声明为object,拥有block scope,但无extern修饰的标识符。

[注1]
关于“结构体的标签”我们举例说明:
struct point_t {
 int x;
 int y;
};
point_t被称为“结构体的标签”,注意在ANSI C中“结构体的标签”不是类型,不能单独使用。必须和struct联合使用。
如:point_t origin; /* error */
    struct point_t origin; /* ok */

[注2]
关于这句话“同一个标识符在程序的“不同点”处可以表示不同的“实体”(entity)”还是很好理解的。一般都是由于Scope的不同。例如:

src1.c中的static int count和src2.c中的同名的static int count。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats