typedef是一个定义吗?

时间:2011-04-18 15:05:24

标签: c++

我真的很困惑。我正在阅读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,   该实体是用作变量的适当内存量 - 即   将分配内存。白天它是指定的功能。为了   常数pi,它是值3.1415926535897932385。对于Date,该实体是   一种新型。 对于Point,它是类型复合体,因此Point变为a   复杂的同义词。在上述声明中,只有这些声明也没有   定义:

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

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

4 个答案:

答案 0 :(得分:6)

虽然我对此完全感到困惑。标准很清楚。 Typedef只是一个声明。不定义。

  

<强> 3.1-2

     

声明是一个定义,除非   它声明了一个没有的函数   指定函数的主体(8.4),   它包含extern说明符   (7.1.1)或联动规范24)   (7.5)既不是初始化者也不是初始化者   函数体,它声明了一个静态   类声明中的数据成员   (9.4),它是一个类名声明   (9.1),或者是 typedef   声明(7.1.3),a   使用声明(7.3.3),或   using-directive(7.3.4)。

编辑:哦,我才明白为什么。你可以输入一个声明,因此一个typedef必须是一个声明本身。

答案 1 :(得分:2)

typedef是一个类型别名,而不是一个新类型。使用typedef,没有定义任何新内容,而是给现有定义第二个名称 - 就像nightcracker是你的别名,而不是你的真名,但它们都引用同一个实体:你。

答案 2 :(得分:1)

如何区分作为定义的声明和不是声明的声明?

简单:您只能拥有每个实体的一个定义,但需要尽可能多的声明。

因为你可以说

 typedef int Foo;
 typedef int Foo;

没有任何问题,这不是一个定义。或者也许因为这不是一个定义,你可以这么说。无论哪种方式,您的编译器都可以轻松判断哪个是。

请注意,在C中重复typedef是非法的,因此typedef声明 是C中的定义。

答案 3 :(得分:0)

定义创建一个对象,所以:

int x;

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