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

时间:2011-12-07 21:24:44

标签: c++ c compiler-construction

我一直对这里发生的事情感到有些困惑:

#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总是让我感到困惑。)

6 个答案:

答案 0 :(得分:73)

从语法上来说,对待struct几乎都是一样的。只有C ++添加了一个额外的规则,允许在没有歧义的情况下省略struct(和class)关键字。

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

答案 1 :(得分:10)

我想说这是两种语言的设计决定。

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

作为旁注,C ++中仍然允许struct foostruct foo更容易解析,然后输入typedef'd foo,因为名称查找更简单。

答案 2 :(得分:9)

考虑C ++的最初想法(或者,当它只是一个想法,“C with classes”),面向OO的语言,与C兼容,大多数有效的C程序也是有效的C ++程序

C ++通过从C struct开始并添加一些其他功能来构建其类模型:

  1. 继承(虽然你可以在C中接近结构的第一个成员,你想要“继承”的结构。)
  2. 信息隐藏(通过publicprivate等)
  3. 成员方法(最初由宏转换为结构外部的C代码并添加了this参数 - 许多实现在实践中仍然相似)。
  4. 此时有两个问题。第一个是默认访问必须是公共的,因为C没有信息隐藏,因此从C ++的角度看,所有内容都是公开的。对于好的OO,应默认为私有。这是通过添加与class完全相同的struct来解决的,除了默认值为private而不是public

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

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

答案 3 :(得分:7)

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

答案 4 :(得分:7)

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

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

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

答案 5 :(得分:3)

当然,首先是C的方式。 C ++中的结构和类几乎完全相同,并且对每个类变量都要求class非常不方便,因此对它们进行了简化。