首先,示例代码:
案例1:
typedef char* CHARS;
typedef CHARS const CPTR; // constant pointer to chars
以文本方式替换CHARS:
typedef char* const CPTR; // still a constant pointer to chars
案例2:
typedef char* CHARS;
typedef const CHARS CPTR; // constant pointer to chars
以文本方式替换CHARS:
typedef const char* CPTR; // pointer to constant chars
在案例2中,在文本替换CHARS之后,typedef的含义发生了变化。为什么会这样? C ++如何解释这个定义?
答案 0 :(得分:34)
在文本替换的基础上分析typedef
行为毫无意义。 Typedef-name不是宏,不会以文本方式替换它们。
正如你自己注意到的那样
typedef CHARS const CPTR;
与
相同typedef const CHARS CPTR;
出于同样的原因
typedef const int CI;
与
具有相同的含义typedef int const CI;
Typedef-name没有定义新类型(只有现有的别名),但它们在某种意义上是“原子的”,任何限定符(如const
)都适用于最高级别,即它们适用到typedef-name后面隐藏的整个类型。一旦定义了typedef-name,就不能在其中“注入”限定符,以便它可以修改该类型的任何更深层次。
答案 1 :(得分:13)
Typedef不是一个简单的文本替换。
typedef const CHARS CPTR;
表示“CPTR类型将是const CHARS事物。”但是CHARS是一个指向char类型的指针,因此这表示“CPTR类型将是一个const指针指向char类型”。这与您在进行简单替换时所看到的不符。
换句话说,
typedef char * CHARS;
与
相同#define CHARS char *
typedef语法类似于变量声明,不同之处在于它不是将目标名称声明为变量,而是将其声明为新的类型名称,可用于声明变量的类型变量而不是的typedef。
这是一个简单的过程,用于确定typedef声明的内容:
删除typedef
关键字。现在你将有一个变量声明。
const CHARS CPTR;
找出该变量的类型(某些编译器有一个typeof()
运算符,它完全正确,并且非常有用)。调用类型T.在这种情况下,指向(非常量)char的常量指针。
替换typedef
。您现在声明一个新类型(CPTR
),它与T完全相同,是一个指向(非常量)char的常量指针。