我一直对这里发生的事情感到有些困惑:
#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总是让我感到困惑。)
答案 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 foo
。 struct foo
更容易解析,然后输入typedef'd foo
,因为名称查找更简单。
答案 2 :(得分:9)
考虑C ++的最初想法(或者,当它只是一个想法,“C with classes”),面向OO的语言,与C兼容,大多数有效的C程序也是有效的C ++程序
C ++通过从C struct
开始并添加一些其他功能来构建其类模型:
public
,private
等)this
参数 - 许多实现在实践中仍然相似)。此时有两个问题。第一个是默认访问必须是公共的,因为C没有信息隐藏,因此从C ++的角度看,所有内容都是公开的。对于好的OO,应默认为私有。这是通过添加与class
完全相同的struct
来解决的,除了默认值为private
而不是public
。
另一个是这个OO透视图应该timeval
或任何其他类/结构与int
或char
处于相同的“基础”,而不是在代码中经常注释为特别。这是通过放宽规则来解决的,即在声明该类型的变量时必须在类型名称之前放置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
非常不方便,因此对它们进行了简化。