是一个类型定义

Is a typedef a definition?

本文关键字:一个 类型 定义      更新时间:2023-10-16

我真的很困惑。我正在阅读Bjarne Stroustrup的tc++ PL(特别版,第19版- 2010年9月)。让我引用书中的一部分来强调我的困惑:

char ch;
string s;
int count = 1;
const double pi = 3.1415926535897932385;
extern int error_number;
const char* name = "Njal";
const char* season[] = { "spring", "summer", "fall", "winter" };
struct Date { int d, m, y; };
int day(Date* p) { return p->d; }
double sqrt(double);
template<class T> T abs(T a) { return a<0 ? -a : a; }
typedef complex<short> Point;
struct User;
enum Beer { Carlsberg, Tuborg, Thor };
namespace NS { int a; }

从这些例子中可以看出,声明可以做的不仅仅是简单将类型与名称关联。这些声明中的大多数也是定义;也就是说,它们还为它们所引用的名称定义了一个实体。ch,该实体是要用作变量的适当内存量-即将分配内存。对于day,它是指定的函数。为常数圆周率,其值为3.1415926535897932385。对于Date,该实体为一种新型。对于Point,它是复数类型,因此Point变成a复数的同义词。在上述声明中,只有这些不是定义:

double sqrt(double);
extern int error_number;
struct User;
typedef complex<short> Point <-- WTF;

粗体的句子与下面给出的列表不冲突吗?类型定义只是一个声明还是也是一个定义?这是书中的错误吗?

虽然我完全被这搞糊涂了。标准是明确的。Typedef只是一个声明。没有定义。

3.1 - 2

声明是定义,除非它声明了一个函数指定函数体(8.4),它包含外部说明符(7.1.1)或链接-规格24)(7.5),既不是初始化式,也不是函数体,它声明了一个静态对象类声明中的数据成员(9.4),它是一个类名声明(9.1),或者它是一个类型定义声明(7.1.3)使用-declaration(7.3.3),或使用指示(7.3.4)。

编辑:哦,我刚刚意识到为什么。你可以typedef一个声明,因此typedef本身必须是一个声明。

typepedef是类型别名,而不是自身的新类型。使用typedef,不会定义任何新内容,而是为现有定义赋予第二个名称——就像nightcracker是您的别名,而不是您的真实名称,但它们都指向同一个实体:您。

如何区分一个声明是定义还是不是定义?

简单:每个实体只能有一个定义,但是你想要多少声明就有多少。

因为你可以说

 typedef int Foo;
 typedef int Foo;

没有任何问题,这不是定义。或者因为这不是一个定义,你可以这么说。无论哪种方式,编译器都可以很容易地分辨出哪个是哪个。

注意,在C语言中,重复typedef是非法的,所以typedef声明在C语言中是定义。

定义创建一个对象,因此:

int x;

是一个名为x的int类型的定义。typedef不创建对象,它为现有类型创建一个新名称,因此它不是定义。

相关文章: