是一个类型定义
Is a typedef a definition?
我真的很困惑。我正在阅读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只是一个声明。没有定义。
编辑:哦,我刚刚意识到为什么。你可以typedef一个声明,因此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)。
typepedef是类型别名,而不是自身的新类型。使用typedef,不会定义任何新内容,而是为现有定义赋予第二个名称——就像nightcracker是您的别名,而不是您的真实名称,但它们都指向同一个实体:您。
如何区分一个声明是定义还是不是定义?
简单:每个实体只能有一个定义,但是你想要多少声明就有多少。
因为你可以说
typedef int Foo;
typedef int Foo;
没有任何问题,这不是定义。或者因为这不是一个定义,你可以这么说。无论哪种方式,编译器都可以很容易地分辨出哪个是哪个。
注意,在C语言中,重复typedef是非法的,所以typedef声明在C语言中是定义。定义创建一个对象,因此:
int x;
是一个名为x的int类型的定义。typedef不创建对象,它为现有类型创建一个新名称,因此它不是定义。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 更改可变参数模板中的最后一个类型
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 有没有办法同时将一个类型分配给C++中的多个模板?
- C++:可以模板化一个类型名称吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 期望一个类型,得到一个模板
- 初始化一个类型向量的巨大向量<int>
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 具有多种类型的类数组?如何访问数组中的一个类型
- Opencv C++ 声明一个类型为 uint8 的矩阵
- 模板参数列表中只有一个类型名称是什么意思?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 为什么我们有一个类型不匹配
- 在函数模板中将一个类型名映射到另一个类型名
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 在C API中定义了一个类型,如何将其与命名空间中的C++类相关联