为什么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并添加一些其他功能来构建它的类模型:

  • 继承(尽管你可以靠近C,让结构的第一个成员是你想要“继承”的结构)。
  • 信息隐藏(通过publicprivate等)
  • 成员方法(最初通过宏将其转换为结构外的C代码并添加了this参数 - 许多实现在实践中仍然类似)。
  • 此时有两个问题。 首先是默认访问必须是公开的,因为C没有信息隐藏,因此从C ++的角度来看,所有东西都是公开的。 对于良好的面向对象,应该默认为私有。 这是通过添加与struct非常相似的class来解决的,除了默认为private而非public

    另一个是这个OO透视图应该有timeval或任何其他类或结构与intchar相同的“基础”,而不是在代码中不断注释为特殊的。 这是通过放宽规则来解决的,即在声明该类型的变量时必须将类型名称放在struct (或class )之前。 因此struct timeval tv可以变成timeval tv

    这随后影响了后来的C语法OO语言,例如Java和C#,以至于在C#中只有较短的形式( timeval tv )才是有效的语法。

    链接地址: http://www.djcxy.com/p/86185.html

    上一篇: Why does C need "struct" keyword and not C++?

    下一篇: Core libraries with android maven plugin