1

这个陈述如何定义?难道它不应该只是一个声明,因为它在我们定义一个 struct date 类型的对象之前不分配任何内存?

struct Date { int d , m , y ; };

我正在阅读 Bjarne Stroustrup 所著的《C++ 编程语言》这本书,其中(在第 4.9 节中)已经说过这是一个声明和一个定义。

4

4 回答 4

4
struct Date; // forward declaration

struct Date{ int d, m, y; }; // class definition (struct is a class-key) 

另见ISO 14882:98 9.1-1 和 -2 类定义

也相关ISO 14882:98 3.2 单一定义规则

于 2012-04-26T10:15:37.250 回答
4

这不是任何一种语言的声明。C99 在 6.8 中定义语句,C++11 在 6 中定义语句。

在 C 中,它不是一个定义,它只是一个声明:C99 的 6.7/5 说:

标识符的定义是对该标识符的声明: — 对于一个对象,导致为该对象保留存储空间;——对于函数,包括函数体;— 对于枚举常量或 typedef 名称,是标识符的(唯一)声明。

由于这不是这三件事,所以它不是标识符的定义。在 C99 语法中,它是一个struct-or-union-specifier(后跟一个分号),而后者又是一个type-specifier(后跟一个分号),这是允许的声明形式之一(6.7/1)。

在 C++ 中,它是一个类说明符或类定义:C++11 的 9/2 说

说明符通常称为类定义。

在 C 和 C++ 中,通常说“每个定义都是声明”,所以这可能就是 Stroustrup 说它既是声明又是定义的原因。

由于上述“定义”的定义,在 C 语言中这是严格正确的。在 C++ 中,我认为在语法中类说明符是声明实际上并不正确,但类定义引入了完整类型,而类声明引入了不完整类型。不完整的类型没有什么可以做,而完整的类型也不能做,所以类定义“和”类声明一样struct Date;好,甚至更好。

于 2012-04-26T10:22:03.457 回答
0

struct Date这是C 和DateC++ 中新类型的声明。声明不是陈述。并且没有为新类型的声明保留任何内存。

于 2012-04-26T10:14:26.690 回答
0

它声明了类型Date。它定义了Dates 成员,因此定义了它将创建的对象的大小。

它没有声明任何方法,因此不需要为类完成任何其他定义。

此外,如果您不声明或定义构造函数、析构函数、赋值运算符等,C++ 将尝试自动为您合成它们。所以这个最小的定义Date包括一个默认构造函数、赋值运算符和析构函数。

于 2012-04-26T10:25:34.680 回答