为什么C需要“struct”关键字而不是C ++?
我一直对这里发生的事情有点困惑:
#include <stdio.h>
int main() {
timeval tv;
tv.tv_sec = 1;
for (;;) {
select(0, 0, 0, 0, &tv);
printf("%sn", "Hello World!");
}
}
很抱歉,如果没有编译,只是将它写成一个简单的例子。
这样的代码不会在gcc下编译,除非在使用struct timeval之前添加关键字struct 。 另一方面,g ++可以很好地处理它。
这与C和C ++如何处理结构有什么不同?还是仅仅是编译器的区别? (我是非常面向C ++的,并且像这样在C语言中使用struct会让我感到困惑)。
语法上,两者的struct
几乎相同。 只有C ++增加了一个额外的规则,允许在没有歧义的情况下省略struct
(和class
)关键字。
如果不明确,C ++在某些地方需要struct
关键字。 一个臭名昭着的例子是POSIX系统上的stat
,其中有一个struct stat
和一个函数stat
。
我会说这是两种语言的设计决定。
C中的结构只是结构化的记录,具有不同的用法,然后是内置类型。
C ++有ctors和operator重载,所以它们作为类型。
struct foo x; // create a structure of pattern foo
typedef foo foo_type; // "define" a type
foo_type x; // create an instance of type foo_type
C ++:
foo x; // create an instance of type foo
作为附注, struct foo
仍然允许在C ++中使用。 因为名称查找更简单,所以struct foo
更容易解析,然后输入typedef'd foo
。
考虑C ++的最初想法(或者,当它仅仅是一个想法时,“带有类的C”),一种面向OO的语言与C兼容,以至于大多数有效的C程序也是有效的C ++程序。
C ++通过从C的struct
并添加一些其他功能来构建它的类模型:
public
, private
等) this
参数 - 许多实现在实践中仍然类似)。 此时有两个问题。 首先是默认访问必须是公开的,因为C没有信息隐藏,因此从C ++的角度来看,所有东西都是公开的。 对于良好的面向对象,应该默认为私有。 这是通过添加与struct
非常相似的class
来解决的,除了默认为private
而非public
。
另一个是这个OO透视图应该有timeval
或任何其他类或结构与int
或char
相同的“基础”,而不是在代码中不断注释为特殊的。 这是通过放宽规则来解决的,即在声明该类型的变量时必须将类型名称放在struct
(或class
)之前。 因此struct timeval tv
可以变成timeval tv
。
这随后影响了后来的C语法OO语言,例如Java和C#,以至于在C#中只有较短的形式( timeval tv
)才是有效的语法。