我真的很困惑。我正在阅读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只是一个声明还是一个定义?这是书中的错误吗?
答案 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不会创建对象,它会为现有类型创建新名称,因此它不是定义。