现在的位置: 首页 > 综合 > 正文

这么多年了,我还是那么肤浅:未详细阅读语言标准

2014年01月26日 ⁄ 综合 ⁄ 共 628字 ⁄ 字号 评论关闭

今天整理电子书籍的时候,看到《你必须知道的495个C语言问题》(中文版的,最新的英文版:http://c-faq.com/index.html)。我虽然是搞C++的,但本着学习和温故知新的精神,还是打开浏览了一下。结果看下来,我一阵汗颜:不少问题自己都没有注意到,比如:

1. struct x1 { . . . };和 typedef struct { . . . } x2; 有什么不同?

第一种形式声明了一个 “结构标签”; 第二种声明了一个 “类型定义”。主要的区别是在后文中你需要用“struct x1”引用第一种, 而用“x2”引用第二种。也就是说, 第二种声明更像一种抽象类新 —– 用户不必知道它是一个结构, 而在声明它的实例时也不需要使用 struct 关键字。

另外,C 不是 C++。结构标签不能自动生成类型。

在C++中,可以使用x1 v;定义变量,而在C中,必须使用struct x1 v;。我一直以为C中是可以使用x1 v;的尴尬

2. 关于C灵活数组域:

struct name

{

 int namelen;

 char namestr[];//C99

};

或者

struct name

{

 int namelen;

 char namestr[1];//不符合C标准,但似乎可以在所有的编译器实现中工作

};

C++中不允许有0大小的数组,可用后一种实现灵活数组域。

3. 聚合初始化:

int x[2][2] = { 3, 1, 4, 2 };//我只认识int x[2][2] = { {3, 1}, {4, 2} };

int a[10] = 0;

 

 

得详细阅读C++11了。

抱歉!评论已关闭.