为什么C需要“struct”关键字而不是C ++?

我一直对这里发生的事情有点困惑:

#include <stdio.h> int main() { timeval tv; tv.tv_sec = 1; for (;;) { select(0, 0, 0, 0, &tv); printf("%s\n", "Hello World!"); } } 

对不起,如果没有编译,只是把它写成一个简单的例子。

这样的代码不会在gcc下编译,除非在使用struct timeval之前添加关键字struct 。 另一方面,g ++可以很好地处理它。

这是C和C ++如何处理结构之间的差异,还是只是在编译器的差异? (我是非常面向C ++的,并且像这样在C语言中使用struct会让我感到困惑)。

句法struct几乎相同。 只有C ++增加了一个额外的规则,允许在没有歧义的情况下省略struct (和class )关键字。

如果有歧义,C ++在某些地方需要struct关键字。 一个臭名昭着的例子是在POSIX系统中有一个struct stat和一个函数stat

我会说这是两种语言的devise决定。

C中的结构只是结构化的logging,并有不同的用法,然后是内置的types。

C ++有ctors和operator重载,所以它们作为types。

 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更容易parsing,然后typedef'd foo作为名称查找更简单。

这只是语言的差异。 C ++在其结构语法中更宽松。

考虑一下C ++的原始思想(或者,当它只是一个想法时,“C with classes”),一个面向OO的语言与C兼容,以至于大多数有效的C程序也是有效的C ++程序。

C ++通过从C的struct并添加一些更多的function来构build它的类模型:

  1. inheritance(尽pipe你可以靠近C,让结构的第一个成员是你想要“inheritance”的结构)。
  2. 信息隐藏(通过publicprivate等)
  3. 成员方法(最初由macros转换为结构之外的C代码,增加了this参数 – 许多实现在实践中仍然是相似的)。

此时有两个问题。 首先是默认访问必须是公开的,因为C没有信息隐藏,因此从C ++的angular度来看,一切都是公开的。 对于良好的面向对象,应该默认为私有。 这是通过添加与struct几乎相同的class来解决的,除了默认是private而不是public

另一个是,这个OO的angular度应该有timeval或任何其他类/结构在相同的“立足点”作为intchar ,而不是不断地在代码中注释为特殊的。 这是通过放宽规则,即在声明该types的variables时必须将types名称放在struct (或class )之前解决的。 因此, struct timeval tv可以成为timeval tv

这随后影响了后来的C语法OO语言,比如Java和C#,直到在C#中只有较短的forms( timeval tv )才是有效的语法。

这只是C的样子。 因此,以下模式在C中很常见:

 typedef struct YourStructure { int x; // more fields } YourStructure; 

然后你可以像在C ++中一样引用它。

C的方式当然是第一次。 C ++中的结构和类几乎是相同的,对于每个类variables都要求使用class是非常不方便的,所以对于两者来说都是简化的。