Joh*_*0te 40 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!");
}
}
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果没有编译,只需将其作为一个简单的例子写下来.
像这样的代码不会在gcc下编译,除非我在使用struct timeval之前添加关键字struct.另一方面,g ++处理得很好.
这是C和C++如何处理结构之间的区别,还是只是编译器的差异?(我非常注重C++,在像这样的C行中使用struct总是让我感到困惑).
Jen*_*edt 77
从句法上讲,两者的对待struct几乎相同.只有C++添加了一个额外的规则,允许在没有歧义的情况下省略struct(和class)关键字.
如果存在歧义,C++也需要struct在某些地方使用关键字.一个臭名昭着的例子是statPOSIX系统,它有一个struct stat和一个功能stat.
Jon*_*nna 11
考虑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#)产生了影响,例如,只有较短的form(timeval tv)才是C#中的有效语法.
Pub*_*bby 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
Run Code Online (Sandbox Code Playgroud)
C++:
foo x; // create an instance of type foo
Run Code Online (Sandbox Code Playgroud)
作为旁注,struct fooC++中仍然允许使用.struct foo更容易解析然后typedef'd,foo因为名称查找更简单.
这就是C的样子.因此,以下模式在C中很常见:
typedef struct YourStructure
{
int x;
// more fields
} YourStructure;
Run Code Online (Sandbox Code Playgroud)
然后你可以像在C++中一样引用它.
这只是语言的差异.C++的struct语法更宽松.