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

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.

  • 还有一个示例或“struct sigaction”和“int sigaction(...)”方法用于在 Linux 中处理信号(来自“signal.h”),如果您想使用“struct”关键字,则需要使用“struct”关键字。结构` (2认同)

Jon*_*nna 11

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

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

  1. 继承(尽管你可以在C中接近,让结构的第一个成员成为你想要"继承"的结构).
  2. 信息隐藏(通过public,private等等)
  3. 成员方法(最初由宏转换为结构外部的C代码,带有附加this参数 - 许多实现在实践中仍然类似).

此时有两个问题.第一个是默认访问必须是公共的,因为C没有信息隐藏,因此从C++的角度看,所有内容都是公开的.对于好的OO,应默认为私有.这是通过添加class几乎完全相同的解决方案来解决的,struct除了默认值private而不是public.

另一种是,这种OO角度应该有timeval或相同的"立足点"任何其他类/结构intchar,而不是在特殊的代码注释不断.这是通过放宽规则来解决的,即在声明该类型的变量时必须在类型名称之前放置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因为名称查找更简单.


Kri*_*izz 8

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

typedef struct YourStructure
{
   int x;
   // more fields
} YourStructure;
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*nan 7

这只是语言的差异.C++的struct语法更宽松.

  • 宽容是一个非常不合适的词. (4认同)
  • 因为这是关于命名空间而不是关于放纵性. (3认同)
  • @Basile从编码器的角度来看,C++结构语法更加宽容。这是最重要的一点。我怀疑这种变化的动机与命名空间有关。其动机肯定是为了让程序员的生活变得更轻松、更简单。 (2认同)
  • @BasileStarynkevitch,C++从C继承了相同的"类型"命名空间(在C意义上).它只有一个额外的规则来将标记命名空间中的标识符解释为类型.请参阅我的答案以获取示例. (2认同)